Background Image
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

1. 참고사항

1-1. Release Note
  - 8.2.2버전에서 'CACHE <cached_num> / NOCACHE' 기능 추가

CUBRID 2008 Release Note / CUBRID 2008 R2.2 Release Note / 2 What's New in CUBRID 2008 R2.2 / New Features
CUBRIDSUS-1961 Added SERIAL CACHE feature to improve serial performance

A CACHE option is supported, which can cache a specified number of serials when defining SERIAL objects.
--------------------------------------------------------------------------------
CREATE SERIAL order_no
START WITH 10000 INCREMENT BY 2 MAXVALUE 20000
CACHE 100;
--------------------------------------------------------------------------------

1-2. Manual
  - 8.3.x 버전 메뉴얼부터 'ALTER SERIAL ... CACHE <cached_num> / NOCACHE' 기능설명 및 예제 추가
      8.2.1 버전 한글 메뉴얼에는 'ALTER SERIAL ... CACHE <cached_num> / NOCACHE' 관련 설명이 있으나 영문 메뉴얼에는 설명이 없음



2. 'ALTER SERIAL ... CACHE <cached_num> / NOCACHE' ERROR 확인

2-1. 대상 : CUBRID 8.2.2 ~ 8.4.x 버전

2-2. 재현절차

-- CREATE SERIAL
CREATE SERIAL order_no START WITH 10000 INCREMENT BY 2 MAXVALUE 20000 CACHE 3;

-- '<serial_name>' 뒤에 다른 옵션을 주지 않고 단독 옵션으로 'CACHE <cached_num> / NOCACHE' 옵션을 주었을 때
ALTER SERIAL order_no CACHE 5; -- ERROR 발생
ALTER SERIAL order_no NOCACHE; -- ERROR 발생

-- ERROR
ERROR: Specify alter serial option.

-- '<serial_name>' 뒤에 다른 옵션과 함께 'CACHE <cached_num> / NOCACHE' 옵션을 주었을 때
-- 'CACHE <cached_num>'은 정상적인 기능 수행을 하지만 'NOCACHE'는 정상적인 기능 수행을 하지 않음

ALTER SERIAL order_no START WITH 10000 INCREMENT BY 2 MAXVALUE 20000 CACHE 5;
-- '<cached_num>' 값이 5로 바뀜

ALTER SERIAL order_no START WITH 10000 INCREMENT BY 2 MAXVALUE 20000 NOCACHE;
-- '<cached_num>' 값이 0이 되지 않고 5로 유지



3. 해결방법

3-1. 'ALTER SERIAL ... CACHE <cached_num>'
  - '<serial_name>' 뒤에 다른 옵션과 함께 'CACHE <cached_num>' 옵션 사용

ALTER SERIAL order_no INCREMENT BY 1 CACHE 100;

  - db_serial 테이블을 UPDATE 해서 <cached_num> 값을 주면 아래와 같은 문제 발생 (사용하면 안 됨, ALTER SERIAL 사용)
    ① 메모리에 <cached_num> 값을 가지고 있어서 100 → 50 으로 UPDATE 하더라도 DB 재구동 전까지 100 값을 사용

-- CREATE SERIAL
CREATE SERIAL order_no START WITH 1 INCREMENT BY 1 MAXVALUE 100000000 CACHE 100;

-- UPDATE SERIAL <cached_num> : 100 → 50
UPDATE db_serial SET cached_num = 50 WHERE name ='order_no'; -- 사용하면 안 됨

-- db_serial 테이블 SELECT
<00001> name         : 'order_no'
        owner        : db_user
        current_val  : 100 -- 초기 <cached_num> 값대로 100 확인
        increment_val: 1
        max_val      : 100000000
        min_val      : 1
        cyclic       : 0
        started      : 1
        class_name   : NULL
        att_name     : NULL
        cached_num   : 50 -- UPDATE SERIAL Query로 100 → 50 변경

-- tbl 테이블에 ROW 입력 중
...
98 2017-03-08 10:14:55.053
99 2017-03-08 10:14:55.560
101 2017-03-08 10:14:56.067
102 2017-03-08 10:14:56.574
...

-- db_serial 테이블 SELECT
<00001> name         : 'order_no'
        owner        : db_user
        current_val  : 200 -- db_serial 테이블의 <cached_num> 값은 무시하고
                              초기 <cached_num> 값대로 100씩 증가
        increment_val: 1
        max_val      : 100000000
        min_val      : 1
        cyclic       : 0
        started      : 1
        class_name   : NULL
        att_name     : NULL
        cached_num   : 50

    ② 'CACHE → NOCACHE →  CACHE' 사용할 경우 메모리에 남아있던 CACHE 값부터 사용하면서 SERIAL 값 중복 ERROR 발생

-- CREATE SERIAL
CREATE SERIAL order_no START WITH 1 INCREMENT BY 1 MAXVALUE 100000000 CACHE 100;

-- db_serial 테이블 SELECT
<00001> name         : 'order_no'
        owner        : db_user
        current_val  : 100
        increment_val: 1
        max_val      : 100000000
        min_val      : 1
        cyclic       : 0
        started      : 1
        class_name   : NULL
        att_name     : NULL
        cached_num   : 100

-- tbl 테이블에 ROW 입력 중
1 2017-03-08 10:52:15.162
2 2017-03-08 10:52:15.680
3 2017-03-08 10:52:16.186
...



-- UPDATE SERIAL : NOCACHE
UPDATE db_serial SET cached_num = 0 WHERE name ='order_no';

-- db_serial 테이블 SELECT
<00001> name         : 'order_no'
        owner        : db_user
        current_val  : 103
        increment_val: 1
        max_val      : 100000000
        min_val      : 1
        cyclic       : 0
        started      : 1
        class_name   : NULL
        att_name     : NULL
        cached_num   : 0

-- tbl 테이블에 ROW 입력 중
-- NOCACHE가 되면서 db_serial 테이블의 current_val 값부터 SERIAL 값으로 사용
...
78 2017-03-08 10:52:54.113
79 2017-03-08 10:52:54.617
80 2017-03-08 10:52:55.122
101 2017-03-08 10:53:05.224
102 2017-03-08 10:53:05.729
103 2017-03-08 10:53:06.233
...



-- UPDATE SERIAL : CACHE
UPDATE db_serial SET cached_num = 50 WHERE name ='order_no'; -- 사용하면 안 됨

-- db_serial 테이블 SELECT
<00001> name         : 'order_no'
        owner        : db_user
        current_val  : 160
        increment_val: 1
        max_val      : 100000000
        min_val      : 1
        cyclic       : 0
        started      : 1
        class_name   : NULL
        att_name     : NULL
        cached_num   : 50

-- tbl 테이블에 ROW 입력 중
...
158 2017-03-08 10:53:20.873
159 2017-03-08 10:53:21.377
160 2017-03-08 10:53:21.881
81 2017-03-08 10:53:22.386
82 2017-03-08 10:53:22.890
83 2017-03-08 10:53:23.395
...
99 2017-03-08 11:06:08.570
100 2017-03-08 11:06:09.076

SQLException : Operation would have caused one or more unique constraint violations.
               INDEX pk_tbl_cnt(B+tree: 0|133|580) ON CLASS tbl(CLASS_OID: 0|522|5).
               key: 137(OID: 0|541|387).

3-2. 'ALTER SERIAL ... NOCACHE'
  - csql에 sysadm 권한으로 접속해서 db_serial 테이블의 cached_num 값을 0으로 UPDATE Query 수행

UPDATE db_serial SET cached_num = 0, current_val = SERIAL_CURRENT_VALUE(order_no) WHERE name ='order_no';

  - 'current_val = SERIAL_CURRENT_VALUE(order_no)' current_val를 수정하지 않아도 되지만 SERIAL 값의 공백을 없애기 위해서 사용 권장

-- CREATE SERIAL
CREATE SERIAL order_no START WITH 1 INCREMENT BY 1 MAXVALUE 100000000 CACHE 100;

-- UPDATE SERIAL : NOCACHE
UPDATE db_serial SET cached_num = 0 WHERE name ='order_no';

-- db_serial 테이블 SELECT
<00001> name         : 'order_no'
        owner        : db_user
        current_val  : 103
        increment_val: 1
        max_val      : 100000000
        min_val      : 1
        cyclic       : 0
        started      : 1
        class_name   : NULL
        att_name     : NULL
        cached_num   : 0

-- tbl 테이블에 ROW 입력 중
1 2017-03-08 11:21:29.518
2 2017-03-08 11:21:30.037
3 2017-03-08 11:21:30.543
...
17 2017-03-08 11:21:37.623
18 2017-03-08 11:21:38.129
19 2017-03-08 11:21:38.635
101 2017-03-08 11:21:39.139 -- 19 → 101로 SERIAL 값 건너뜀. SERIAL 값의 공백 발생
102 2017-03-08 11:21:39.643
103 2017-03-08 11:21:40.148



-- UPDATE SERIAL : NOCACHE, current_val 수정
UPDATE db_serial SET cached_num = 0, current_val = SERIAL_CURRENT_VALUE(order_no) WHERE name ='order_no';

-- db_serial 테이블 SELECT
<00001> name         : 'order_no'
        owner        : db_user
        current_val  : 100
        increment_val: 1
        max_val      : 100000000
        min_val      : 1
        cyclic       : 0
        started      : 1
        class_name   : NULL
        att_name     : NULL
        cached_num   : 100

-- tbl 테이블에 ROW 입력 중
1 2017-03-08 11:27:18.203
2 2017-03-08 11:27:18.724
3 2017-03-08 11:27:19.230
...
27 2017-03-08 11:27:31.361
28 2017-03-08 11:27:31.867
29 2017-03-08 11:27:32.372 -- SERIAL 값 건너뜀 없이 ROW 입력. SERIAL 값의 공백 없음

-- db_serial 테이블 SELECT
<00001> name         : 'order_no'
        owner        : db_user
        current_val  : 29 -- 'current_val = SERIAL_CURRENT_VALUE(order_no)'으로 current_val 수정
        increment_val: 1
        max_val      : 100000000
        min_val      : 1
        cyclic       : 0
        started      : 1
        class_name   : NULL
        att_name     : NULL
        cached_num   : 0



4. 결론
  - CUBRID 8.2.2 ~ 8.4.x 버전에서 'ALTER SERIAL ... CACHE <cached_num> / NOCACHE' 기능 수행 시
  - 'ALTER SERIAL ... CACHE <cached_num>'는 다른 옵션과 함께 사용
  - 'ALTER SERIAL ... NOCACHE'는 csql에 sysadm 권한으로 접속해서 db_serial 테이블에 UPDATE Query 수행

-- CREATE SERIAL
CREATE SERIAL order_no START WITH 1 INCREMENT BY 1 MAXVALUE 100000000 CACHE 100;

-- 'ALTER SERIAL ... NOCACHE' 기능 수행
UPDATE db_serial SET cached_num = 0, current_val = SERIAL_CURRENT_VALUE(order_no) WHERE name ='order_no';

-- 'ALTER SERIAL ... CACHE <cached_num>' 기능 수행
ALTER SERIAL order_no INCREMENT BY 1 CACHE 50;



List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
99 응용개발 용량이 큰 데이터를 질의로 저장하는 방법 남재우 2009.11.26 12117
98 응용개발 윈도우 환경에서 PHP 모듈 로드를 못 할 경우 해결법 3 Prototype 2009.11.26 22483
97 응용개발 CUBRID에서 제약조건(PK,FK,UNIQUE),index 설정 시 주의 사항 cubebridge 2009.11.26 18886
96 응용개발 MySQL의 Blob타입을 CUBRID로 변환하기 cubebridge 2009.11.18 18856
95 운영관리 CUBRID에서 데이터가 있는 칼럼의 도메인 변경 시 조치방법 cubebridge 2009.11.16 12409
94 운영관리 cubrid.conf파일 적용의 우선 순위와 HOST적용 우선 순위 cubebridge 2009.11.14 13369
93 질의작성 CUBRID에서 응용프로그램 쿼리 binding 구문이 있을 경우 plan의 차이 cubebridge 2009.11.06 15700
92 응용개발 CUBRID의 Statement pooling기능 cubebridge 2009.11.06 16944
91 CUBRID 매니저 CUBRID Manager에서 character set 변경하기[R2.0] file seongjoon 2009.10.29 17959
90 운영관리 Window서버 cmd창에서 CUBRID 구동 후 cmd창을 닫을 시 DB서비스 중단 조치방법 cubebridge 2009.10.29 16463
89 질의작성 CUBRID DB 내의 auto_increment 값을 초기화 하자. 손승일 2009.10.28 29732
88 기타 CUBRID의OLE DB 드라이버 설치 방법. file seongjoon 2009.08.24 16263
87 CUBRID 매니저 Java SP사용시 JNI_CreateJavaVM 에러메시지 해결 방법 file seongjoon 2009.07.15 32043
86 응용개발 그루비로 큐브리드 함수(or 프로시저) 만들기 by 행복개발자(cyberuls) 시난 2009.07.14 18753
85 응용개발 JDBC 커넥션 스트링에 UTF-8 명시하는법 Prototype 2009.07.03 19017
84 응용개발 weblogic 8.1 에 CUBRID Connection Pool, DataSource 설정 방법 file 웁쓰 2009.07.01 66306
83 기타 CUBRID JDBC Driver 빌드 방법 웁쓰 2009.07.01 16943
82 응용개발 JDBC 사용시 SQL 로깅 - p6spy 사용 1 웁쓰 2009.07.01 35999
81 질의작성 임의의 컬럼을 rownum 으로 업데이트 하기 Prototype 2009.07.01 22532
80 질의작성 중복데이터 제거 방법 Prototype 2009.07.01 25067
Board Pagination Prev 1 ... 5 6 7 8 9 10 11 12 13 14 Next
/ 14

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales