안녕하세요. 구루비에 자주 들려서 많이 보고 배우고 가는 사람입니다.
한가지 질문사항이 있어서 글을 남기네요.
Sequence를 만들어서 NEXTVAL로 테이블에 INSERT하면
값이 증가하면서 테이블에 들어가는데요.
궁금한 점은 단순히 SELECT * FROM 테이블해서 확인했을때
다음과 같이 정렬없이 들어가는 이유는 무엇인지요?
SEQ_NO
4
7
9
11
14
5
3
13
12
2
8
10
15
즉, Sequence가 어떠한 방식으로 테이블에 들어가는지 정말 궁금한데요.
동작 원리나 이 이유에 대해 아시면 꼭 좀 알려주시면 감사드리겠습니다.
테이블 중간에 빠진 값들이 있는데 이와 관련한 문제는 없는지요?
1. 조회 순서 차이
기본 SELECT 정렬순서가 입력순서가 아닐 수 있습니다.
order by를 이용해 정렬하지 않으면 순서가 보장되지 않습니다.
(index를 이용할 수도 있지만 index에 이상이 있거나 plan이 바뀔 수도 있겠죠.)
2. 입력 순서 차이
NEXTVAL 확보 시간과 실제 INSERT 시간이 다른 경우가 있겠네요.
여러개 프로세스, 스레드가 시퀀스 값을 가져오고 중간에 어떤 처리를 한후 해당 값으로 INSERT 하는 경우, 먼저 처리하여 INSERT 하는 값이 들어가게 됩니다.
단순 스레드간의 처리 시간 차이일 수도 있구요.
3. 시퀀스값 캐시
RAC 환경에서 시퀀스 CACHE+NOORDER 인 경우, 각 인스턴스 별로 범위 값을 확보하고 있어 개별 인스턴스마다 NEXTVAL 값이 꼭 순서대로 나오지 않을 수 있습니다.
INST1 (1~20) INSERT 1 INSERT 3
INST2 (21~40) INSERT 21
INST3 (41~60) INSERT 41
또한 오라클 재기동시 캐쉬된 SEQ값이 누락될 수 있습니다.