본문 바로가기

데이터 사이언스 DataScience/Data Base 데이터베이스

[Oracle] 시퀀스의 옵션에 담긴 의미

 

1. 시퀀스(Sequence)란?

 

시퀀스란 영어로 '순서'라는 의미를 갖고 있다.

오라클에서는 시퀀스를 객체로 사용해 자동으로 증가하는 숫자를 사용하는데 이용한다.

 

 

 

2. 시퀀스가 필요한 이유

 

예를 들어 게시판의 글번호는 순차적으로 생성되며 절대 중복되지 않는 Unique한 속성을 갖고 있다.

게시판의 정보를 담는 DB 테이블에는 글 번호가 컬럼으로 존재할 것이다.

 

시퀀스가 없다면 새로운 글이 생성될 때마다 아래와 같은 쿼리를 매번 실행해 글 번호의 최대값을 확인하고

그 보다 1 큰 값을 계산해 새로운 글 번호로 INSERT 하게 된다.

 

SELECT MAX(글 번호)
FROM 게시판 테이블;

글 번호 COLUMN에 INDEX가 생성되어있다면 INDEX_DESC 등의 힌트로 쿼리의 속도 자체는 얼마 안 나올 수 있지만, 

실제 서비스를 운영할 때는 이러한 쿼리를 한 번 실행한다는게 DISK I/O를 계속 발생시키고 DB CONNECTION POOL을 한 개라도 더 사용하기 때문에 부담이 된다.

 

실제로  0.0001초 걸리는 쿼리를 600만 번 실행한다면 600초의 CPU ELAPSE TIME을 소모하게 된다.

(실제 큰 규모의 서비스를 운영하면 1일 600만 번이상 실행하는 쿼리는 빈번한 일)

 

따라서 SEQUENCE 오브젝트로 값을 바로 INSERT하는 식으로 DB에 부하를 덜 줄 수 있다.

 

Ex> 시퀀스 이름이 SEQ1이라면 테이블에 INSERT할때 

INSERT INTO 게시판테이블 VALUES(SEQ1.NEXTVAL); 을 실행하면 시퀀스의 다음 숫자를 바로 INSERT 할 수 있다.

 

 

 

3. 시퀀스 생성시 옵션 정보 파악

 

1) 문법 SYNTAX

CREATE SEQUENCE [이름]
INCREMENT BY [증감숫자] -- 양수면 증가 음수면 감소 기본 1
START WITH [시작숫자] -- 시작숫자의 최초 값은 증가일때 MINVALUE, 감소일때 MAXVALUE
MINVALUE [최솟값] 
MAXVALUE [최대값]
CYCLE OR NOCYCLE -- CYCLE : 최대값에 도달하면 최소값부터 다시 시작 /  NOCYCLE : 최대값 생성시 중지
CACHE [숫자, 생략가능] OR NOCACHE -- CACHE : 메모리에 시퀀스 값을 미리 할당 / NOCACHE 시퀀스값을 메로리에 할당하지 않음
ORDER OR NOORDER -- ORDER : 반드시 순차적으로 모두 채워서 시퀀스를 사용 / NOORDER : 시퀀스 값을 건너뛸 수 있음

위 문법에서 CACHE를 옵션을 사용하면 BUFFERS 영역에 시퀀스 값을 미리 띄어놓게되어 CPU 사용을 줄일 수 있다.

NOCACHE 사용시 BUFFERS 메모리는 절약할 수 있지만 시퀀스를 불러올때마다 CPU를 사용하게 된다.

즉, 빈번하게 INSERT하는 테이블의 경우 CPU의 과도한 사용을 불러오게 된다. (CACHE에 올려놓는게 훨씬 효율적)

 

위 문법에서 NOORDER를 사용할 경우 시퀀스 값을 건너뛸 수 있다.

이것이 가능한 이유는 DB INSTANCE가 여러개일 경우 (RAC : Real Application Cluster 구성시)

각각의 INSTANCE는 동일한 시퀀스를 동시에 부를 수 있고 이 경우 상황에 따라 시퀀스가 건너뛰어지는 일이 생길 수 있다. (Ex> DB 1호기랑 DB 2호기가 같은 시퀀스를 동시에 불러서 NEXTVAL을 부르고 COMMIT은 안 하는 상황 등)

 

순차적으로 모든 숫자가 빠짐이 없어야할 경우 ORDER 옵션을 넣어야 RAC 구성에서 시퀀스가 빠짐없이 순서를 지킬 수 있다.

 

2) 예시

CREATE SEQUENCE SEQ1 --시퀀스이름 SEQ1
INCREMENT BY 1     --증감숫자 1
START WITH 1         --시작숫자 1
MINVALUE 1           --최솟값 1   (** Cycle시 minvalue로 돌아오니 주의해야한다)
MAXVALUE 100000  --최댓값 100,000
NOCYCLE               --순환(재사용)하지 않음
CACHE 10000          --10000만큼 메모리에 시퀀스값 미리할당 (CPU 사용 감소, 빈번한 시퀀스 이용시)
ORDER; 	               -- 숫자 반드시 빠짐없이 시퀀스 생성

 

반응형