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
번호 분류 제목 글쓴이 날짜 조회 수
77 운영관리 CUBRID 브로커와 시스템 메모리 정만영 2019.03.12 2315
76 운영관리 윈도우 OS에서 java sp 사용 시 Java VM is not running 해결 방법 정훈 2017.09.04 2204
» 운영관리 CUBRID 8.2.2 ~ 8.4.x 버전에서 'ALTER SERIAL ... CACHE <cached_num> / NOCACHE' ERROR 해결 방법 주영진 2017.03.08 2146
74 운영관리 큐브리드 포트 정리 정만영 2016.07.05 6062
73 운영관리 큐브리드 마스터 소켓 디렉토리 변경방법 정만영 2016.07.05 4212
72 운영관리 Invalid XASL tree node content 에러 손승일 2016.04.26 4469
71 운영관리 산술 연산 결과를 피젯수 또는 젯수의 자리 수에 맞춰 보자. 성진 2016.03.01 4805
70 운영관리 'Has been interrupted.' CUBRIDException 발생 주현 2016.01.07 6565
69 운영관리 CUBRID BACKUP (linux, window) file 박동윤 2015.12.30 6220
68 운영관리 브로커와 DB 간 연결 테스트 박동윤 2015.12.29 4924
67 운영관리 cubrid plandump ( plan cache정보확인) file 주현 2015.12.29 4292
66 운영관리 시스템 부하가 많지 않음에도 불구하고 질의 수행이 느린 경우 THP 기능 설정 확인 및 해제 진우진 2015.12.16 7507
65 운영관리 큐브리드 서비스 재구동 시 cubrid manager server start: fail 오류 해결 방법 진우진 2015.12.16 7691
64 운영관리 브로커 동적 파라미터 변경 방법 정만영 2015.08.13 7555
63 운영관리 CUBRID HA 구성 후 구동중인 slave/replica node에서 write 하기 정만영 2015.07.15 9034
62 운영관리 windows 환경에서 압축파일로 CUBRID 설치시 환경변수 쉽게 설정하기 김승훈 2015.07.02 6990
61 운영관리 디비와 테이블 문자셋이 다른 경우 처리 방법 이용미 2015.06.03 15781
60 운영관리 CUBRID HA와 Primary key 제약조건 정만영 2015.04.21 11342
59 운영관리 테이블 사용량 확인방법 정만영 2015.02.03 11419
58 운영관리 9.2 버전에서 복제 재구축(ha_make_slavedb.sh) 스크립트를 사용하려면 수정해야 할 부분 brightest 2013.10.24 12228
Board Pagination Prev 1 2 3 4 Next
/ 4

Contact Cubrid

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