데이터베이스에서 주요키(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) : 중복 사용 불가.
'DataBase > Oracle' 카테고리의 다른 글
Oracle ] ANSI Join과 ORACLE Join (0) | 2022.02.08 |
---|---|
oracle, tibero ] WHERE IN 데이터 입력 순서대로 정렬하기 (0) | 2021.11.24 |
데이터활용 ] 시작 및 종료 날짜 데이터 중복체크 하는 방법 (0) | 2020.06.19 |