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
번호 분류 제목 글쓴이 날짜 조회 수
19 질의작성 CUBRID DB 내의 auto_increment 값을 초기화 하자. 손승일 2009.10.28 29734
18 운영관리 큐브리드 사용포트 정리 3 정만영 2009.06.19 29782
17 마이그레이션 CUBRID 하위버젼에서 CUBRID2008로의 업그레이드 방법 1 남재우 2008.12.06 30154
16 운영관리 CUBRID 사용시 방화벽 설정 3 admin 2008.11.21 30999
15 응용개발 php에서 serialize/unserialize 사용 시 주의할 점 시난 2009.12.29 31630
14 CUBRID 매니저 Java SP사용시 JNI_CreateJavaVM 에러메시지 해결 방법 file seongjoon 2009.07.15 32043
13 마이그레이션 MySQL의 limit 명령어 처리 1 admin 2008.11.21 32686
12 운영관리 CUBRID에서의 BLOB/CLOB 사용시 백업 및 복구에 대한 주의 점 cubebridge 2012.09.18 33157
11 응용개발 CUBRID AUTO_INCREMENT 컬럼 MySQL LAST_INSERT_ID() 대체 방법 손승일 2009.12.22 33235
10 응용개발 JDBC 사용시 SQL 로깅 - p6spy 사용 1 웁쓰 2009.07.01 36002
9 기타 좀비 프로세스 일괄 삭제하기 janus 2009.12.12 36126
8 질의작성 예약어를 테이블명이나 컬럼명으로 사용시 admin 2008.11.21 37446
7 질의작성 데이터 존재하면 update, 존재하지 않으면 insert 방법(ON DUPLICATE KEY UPDATE) 손승일 2010.08.11 38002
6 마이그레이션 타 DBMS를 CUBRID로 마이그레이션 시 varchar,char 컬럼 사이즈 관련 손승일 2010.07.01 38025
5 응용개발 Weblogic 10.0 사용시 JDK 1.5를 사용한 JDBC 드라이버 사용시 주의사항. cubebridge 2012.02.22 51957
4 응용개발 WHERE 조건에서 다중 컬럼 IN절 처리 최적화 방법 (cubrid + ibatis) 1 이상신 2015.08.21 55148
3 응용개발 weblogic 8.1 에 CUBRID Connection Pool, DataSource 설정 방법 file 웁쓰 2009.07.01 66306
2 마이그레이션 CUBRID vs MySQL vs ORACLE SQL 타입별 비교 정만영 2013.07.12 69167
1 운영관리 csql 데이터 입력방법 정만영 2009.06.09 213415
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