ORACLE학원동영상/오라클 시퀀스(Oracle Sequence), 확장 가능한 시퀀스(Scalable Sequence), 오라클학원교육, 자바오라클교육
http://ojc.asia/bbs/board.php?bo_table=LecOracle&wr_id=300
ojc.asia
오라클 시퀀스

확장 가능한 시퀀스(Scalable Sequences)
https://www.youtube.com/watch?v=S8OhalDs6Mk&list=PLxU-iZCqT52Dlz0zGgFiq1mBz21arFUHS&index=29

실습 : 오라클19C
일반적으로 사용되는 시퀀스는 “일련번호 자동생성기”로 고유한 정수를 생성하는데 사용하는 스키마 객체schema objects입니다.
PK 값을 시퀀스를 이용하여 입력을 할때 시퀀스 번호는 대부분 1 씩 증가하므로 대량의 데이터가 입력된다면 입력되는 데이터는 B*Tree 인덱스의 한쪽끝 리프 블록에 배치되므로 이곳에서 경합이 발생하여 락lock이 발생할 수 있습니다.
오라클 8i 이후 이 문제를 해결하기 위해 역방향 키 인덱스reverse key indexes를 사용했지만 오라클 18C 이후 확장 가능한 시퀀스scalable sequence를 제공 합니다.
확장 가능한 시퀀스는 6자리 접두사를 추가하는데 접두사는 3자리 인스턴스 offset, 3자리 세션 offset으로 구성됩니다. SQL*Plus 및 SQL Developer의 접속을 달리하면 세션이 변하므로 접두사는 변합니다.
[(instance id % 100) + 100] || [session id % 1000] |
오라클에서 시퀀스 생성시 기본 속성은 NOSCALE이고 원하는 경우 명시 적으로 지정할 수 있습니다.
오라클에서 시퀀스를 생성할 때 “SCALE” 속성을 설정하면 “SCALE NOEXTEND”와 동일하며 MAXVALUE 값을 기반으로 6자리 접두사 + 0으로 채우고 순번값(1,2,3,,,)으로 시퀀스가 생성됩니다. (MAXVALUE가 10자리 9999999999 이라면 접두사 6자리 + 0001 이런식으로 시퀀스 값이 만들어 집니다.)
“SCALE EXTEND”로 시퀀스를 만들면 6자리 접두사가 추가되어 MAXVALUE 길이 + 6으로 시퀀스 길이를 만듭니다.
실습
SCALABLE SEQUENCE를 생성 합니다.
minvalue 1, maxvalue 9999999999 값을 가지는 SEQ_TEST 확장 가능한 시퀀스를 생성하세요. 시퀀스 값을 MAXVALUE 길이와 같이 10자리로 만들기 위해 앞6자리는 인스턴스ID, 세션ID로 6자리를 만들고, 나머지4자리를 0으로 만 채우고 순번을 채웁니다. |
CREATE SEQUENCE SEQ_TEST
MINVALUE 1
MAXVALUE 9999999999
SCALE;
<실행결과>
Sequence SEQ_TEST이(가) 생성되었습니다.
생성한 SCALABLE SEQUENCE의 NEXTVAL, CURRVAL을 조회해 보겠습니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 NEXTVAL 값을 조회하세요. |
SELECT SEQ_TEST.NEXTVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013870001 |
시퀀스는 만들고 최초 NEXTVAL하면 1부터 시작됩니다. 시퀀스의 maxvalue가 9999999999 10자리 이고 앞6자리는 접두사가 위치합니다. 나머지 4자리에 시퀀스 값들이 증가하면서 위치 합니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 NEXTVAL 값을 조회하세요. |
SELECT SEQ_TEST.NEXTVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013870002 |
이전의 NEXTVAL에서 1 증가된 값 입니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 CURRVAL 값을 조회하세요. |
SELECT SEQ_TEST.CURRVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013870002 |
SCALE EXTEND로 시퀀스를 만들면 최종 시퀀스 번호는 SCALE로 만든 시퀀스보다 6자리 더 많습니다.
실습
SCALABLE SEQUENCE를 삭제 후 “SCALE EXTEND”로 재생성 합니다.
minvalue 1, maxvalue 9999999999 값을 가지는 SEQ_TEST 시퀀스를 SCALE EXTEND 옵션으로 생성하세요.(삭제 후 재생성 하세요) 오른쪽 10자리는 0으로 채우면서 시퀀스 일련번호를 할당하고 앞6자리는 인스턴스ID, 세션ID로 6자리를 만듭니다. |
DROP SEQUENCE SEQ_TEST;
CREATE SEQUENCE SEQ_TEST
MINVALUE 1
MAXVALUE 9999999999
SCALE EXTEND;
<실행결과>
Sequence SEQ_TEST이(가) 생성되었습니다.
생성한 SCALABLE SEQUENCE의 NEXTVAL, CURRVAL을 조회해 보겠습니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 NEXTVAL 값을 조회하세요. |
SELECT SEQ_TEST.NEXTVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013870000000001 |
시퀀스의 maxvalue가 9999999999 인데 이자리수보다 6자리 많습니다. maxvalue 까지 10자리를 0으로 채우고 시퀀스 값들이 시작되며, 앞6자리에 추가로 접두사가 위치 합니다. 총16자리 입니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 NEXTVAL 값을 조회하세요. |
SELECT SEQ_TEST.NEXTVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013870000000002 |
이 전의 NEXTVAL 값에서 1이 증가 되었습니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 CURRVAL 값을 조회하세요. |
SELECT SEQ_TEST.CURRVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013870000000002 |
실습
이전에 작성한 확장 가능한 시퀀스를 NOSCALE로 변경합니다. |
ALTER SEQUENCE SEQ_TEST NOSCALE;
<실행결과>
Sequence SEQ_TEST이(가) 변경되었습니다.
변경한 SCALABLE SEQUENCE의 CURRVAL을 조회해 보겠습니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 CURRVAL 값을 조회하세요. |
SELECT SEQ_TEST.CURRVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013870000000002 |
NOSCALE 옵션 시퀀스로 변경 되었지만 NEXTVAL을 하지않아 이전에 작성한 시퀀스의 번호 16자리 1013870000000002 값이 16자리 시퀀스 값입니다.
변경한 SCALABLE SEQUENCE의 NEXTVAL을 조회해 보겠습니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 NEXTVAL 값을 조회하세요. |
SELECT SEQ_TEST.NEXTVAL AS SEQ FROM DUAL;
<실행결과>
ORA-08004: 시퀀스 SEQ_TEST.NEXTVAL exceeds MAXVALUE은 사례로 될 수 없습니다. 시퀀스의 maxvalue가 9999999999 인데 현재 시퀀스의 CURRVAL은 “1013870000000002“ 이므로 maxvalue 값을 초과하여 오류가 발생합니다.
시퀀스를 “SCALE NOEXTEND”로 변경합니다.
SEQ_TEST 확장 가능한 시퀀스를 “SCALE NOEXTEND”로 변경하세요. SCALE NOEXTEND는 SCALE 옵션과 동일하며 현재 시퀀스값 자체가 16자리에서 ALTER SEQUENCE 되었으므로 이므로 이 값을 NEXTVAL 하기 위해서는 접두어 6자리가 추가되어 총22자리가 있어야 합니다. |
ALTER SEQUENCE SEQ_TEST SCALE NOEXTEND;
<실행결과>
Sequence SEQ_TEST이(가) 변경되었습니다.
변경한 SCALABLE SEQUENCE의 CURRVAL을 조회해 보겠습니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 CURRVAL 값을 조회하세요. |
SELECT SEQ_TEST.CURRVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013870000000002 |
“SCALE NOEXTEND” 옵션 시퀀스로 변경 되었으므로 “1013870000000002” 값이 16자리 시퀀스 값입니다. NEXTVAL 하면 앞에 6자리 접두사가 붙으니 자리 수 주의해야 합니다.
변경한 SCALABLE SEQUENCE의 NEXTVAL을 조회해 보겠습니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 NEXTVAL 값을 조회하세요. |
SELECT SEQ_TEST.NEXTVAL AS SEQ FROM DUAL;
<실행결과>
ORA-08004: 시퀀스 SEQ_TEST.NEXTVAL exceeds MAXVALUE은 사례로 될 수 없습니다. 시퀀스의 maxvalue가 9999999999 10자리인데 현재 시퀀스의 CURRVAL은 “1013870000000002” 16자리 이고 NEXTVAL을 하면 앞에 6자리 접두사가 붙어 총 22자리가 필요하므로 maxvalue를 초과하였다는 오류가 발생합니다.
시퀀스의 maxvalue를 9999999999999999999999 22자리로 변경합니다.
SEQ_TEST 확장 가능한 시퀀스의 maxvlaue를 9999999999999999999999 22자리 값으로 변경하세요. |
ALTER SEQUENCE SEQ_TEST MAXVALUE 9999999999999999999999;
<실행결과>
Sequence SEQ_TEST이(가) 변경되었습니다.
변경한 SCALABLE SEQUENCE의 NEXTVAL을 조회해 보겠습니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 NEXTVAL 값을 조회하세요. |
SELECT SEQ_TEST.NEXTVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013871999990000000003 |
총22자리에 시퀀스 값이 할당 되었고 앞 부분 6자리는 접두사 입니다.
이번에는 시퀀스를 “SCALE EXTEND”로 변경합니다.
SEQ_TEST 확장 가능한 시퀀스를 SCALE EXTEND로 변경하세요. |
ALTER SEQUENCE SEQ_TEST SCALE EXTEND;
<실행결과>
Sequence SEQ_TEST이(가) 변경되었습니다.
변경한 SCALABLE SEQUENCE의 NEXTVAL을 조회해 보겠습니다.
DUAL 테이블을 이용하여 SEQ_TEST 시퀀스의 NEXTVAL 값을 조회하세요. |
SELECT SEQ_TEST.NEXTVAL AS SEQ FROM DUAL;
<실행결과>
| SEQ |
1 | 1013870000001999990000000004 |
22자리 최대길이에 더해 앞6자리에 새로운 접두사가 붙었습니다. 전체 28자리 입니다. SCALE EXTEND는 MAXVALUE 길이를 늘이지 않아도 자동 확장 합니다.
생성한 확장 가능한 시퀀스를 딕셔너리 뷰에서 조회해 보겠습니다.
실습
USER_SEQUENCES 뷰는 사용자가 생성한 시퀀스의 정보를 제공하는 뷰 입니다.
USER_SEQUENCES 뷰에서 SEQ_TEST 시퀀스의 정보를 조회하세요. |
SELECT SEQUENCE_NAME,
SCALE_FLAG,
EXTEND_FLAG
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = 'SEQ_TEST';
<실행결과>
| SEQUENCE_NAME | SCALE_FLAG | EXTEND_FLAG |
1 | SEQ_TEST | Y | Y |
SEQ_TEST 시퀀스는 이전 실습에서 SCALE EXTEND로 변경을 한 상태 입니다. 그래서 SCALE_FLAG, EXTEND_FLAG 값이 ‘Y’ 입니다.
#확장가능한시퀀스,#Scale시퀀스, #오라클시퀀스,#시퀀스, #오라클학원, #SQL학원, #SQL교육, #오라클교육, #ORACLE교육, #ORACLE학원, #ORACLE동영상, #ORACLE강좌, #오라클학원동영상, SQL학원동영상,확장가능한시퀀스,Scale시퀀스, 오라클시퀀스,시퀀스,오라클학원, SQL학원, SQL교육, 오라클교육, ORACLE교육, ORACLE학원, ORACLE동영상, ORACLE강좌, 오라클학원동영상, SQL학원동영상