728x90

데이터베이스에서 주요키(Primary key)로 인덱스 번호를 생성할 때 보통 1부터 무한대에 숫자로 1씩 증가하면서 사용하는 것을 많이 볼 수 있다. insert할 때 1씩 증가하는 여러가지 방법중 시퀀스를 생성하여 NEXTVAL 함수로 증가시키는 방법과 현재 시퀀스번호의 MAX값의 +1을 하는 사용방법과 차이가 무엇인지 정리하겠다.


1. 시퀀스

① 시퀀스 생성

// 'SEQ_SEQUENCE' 이름의 시퀀스 생성
CREATE SEQUENCE SEQ_SEQUENCE
INCREMENT BY 1
START WITH 1 
MINVALUE 1
MAXVALUE 1000
NOCYCLE → 
CACHE 20 →

 - INCREMENT BY : 증가값

 - START WITH : 초기값

 - MINVALUE : 최소값 | NOMINVALUE : 무한대 값

 - MAXVALUE : 최대값 | NOMAXVALUE : 무한대 값

 - NOCYCLE(기본값) : 사이클 없이 종료. | CYCLE : MAXVALUE값 이후 다시 MINVALUE부터 시작

 - CACHE : 캐시가 20인 경우 메모리에 1~20까지를 미리 저장하고 사용

  ㆍ장점 : 캐시를 사용하면 시퀀스 조회 속도가 빨라진다.

  ㆍ단점 : 만일 시퀀스를 5번까지 사용한 후 DB가 종료되거나 비정상적인 오류가 발생한다면 다시 시작할 때 21부터 시작한다. 왜냐하면 메모리에 저장된 1~20번까지중 사용하지 않는 값들이 모두 제거됐기 때문이다.

* 추가 : CACHE를 미리 값을 할당하지 않을 경우, BUFFERS MEMORY는 절약할 수 있다. 하지만 시퀀스를 사용할 때마다 CPU에서 연산처리해야되기 때문에 빈번한 사용 시 비효율적이다.(CPU에 무리를 줌)

* BUFFERS MEMORY 설명 : [https://dbrang.tistory.com/324]

 

 

② 시퀀스 수정

ALTER SEQUENCE SEQ_SEQUENCE
INCREMENT BY 0
MAXVALUE 2 | NOMAXVALUE → 둘중하나 선택
MINVALUE 9999 | NOMINVALUE → 둘중하나 선택
CYCLE | NOCYCLE → 둘중하나 선택
CACHE | NOCACHE → 둘중하나 선택

 - START WITH는 수정할 수 없다.

 

③ 시퀀스 사용 예제

SELECT SEQ_SEQUENCE.NEXTVAL FROM DUAL;
SELECT SEQ_SEQUENCE.CURRVAL FROM DUAL;

INSERT INTO EXAM_TABLE(SEQ, BOARD_NAME, CATEGORY_SEQ)
VALUES(SEQ_SEQUENCE.NEXTVAL, 'board_name', 5);

 - NEXTVAL : 다음번호 조회

 - CURRVAL : 현재번호 조회

2. MAX+1

SELECT NVL(MAX(SEQ)+1, 1) FROM EXAM_TABLE;

 - MAX+1은 위 코드블럭과 같이 간단하게 사용할 수 있다.

 

3. 차이점

 자 그렇다면 시퀀스는 생성하고 필요시 수정하고 관리를 해야되는 불편함이 있는데 왜 시퀀스를 사용할까?

 그 이유는 중복허용 여부에 있다.

 

 MAX+1로 조회해서 사용하는 경우 동시성이슈가 발생할 때 중복이 될 수 있기때문에 시퀀스를 권장한다.

 예를들어, 3명의 사용자가 동시에 해당 번호를 조회하는 기능을 수행하게되면 PRIMARY KEY로 설정되어있으면

 2명은 EXCEPTION 처리가 될 것이다. 만약 PRIMARY KEY로 설정되지 않은 컬럼이라면 3명다 똑같은 시퀀스번호가

 생성되게 된다.

 

※ 정리

 ① MAX+1 : 중복으로 사용가능.

 ② 시퀀스(Sequence) : 중복 사용 불가.

728x90
TOP