Sequence 관련 질문입니다. 0 3 3,643

by 김용도 Sequence [2014.07.10 09:12:09]


안녕하세요. 구루비에 자주 들려서 많이 보고 배우고 가는 사람입니다.

 

한가지 질문사항이 있어서 글을 남기네요.

 

Sequence를 만들어서 NEXTVAL로 테이블에 INSERT하면

값이 증가하면서 테이블에 들어가는데요.

 

궁금한 점은 단순히 SELECT * FROM 테이블해서 확인했을때

다음과 같이 정렬없이 들어가는 이유는 무엇인지요?

 

 

SEQ_NO

4
7
9
11
14
5
3
13
12
2
8
10
15

 

즉, Sequence가 어떠한 방식으로 테이블에 들어가는지 정말 궁금한데요.

동작 원리나 이 이유에 대해 아시면 꼭 좀 알려주시면 감사드리겠습니다.

 

by 비주류 [2014.07.10 10:15:21]

테이블 중간에 빠진 값들이 있는데 이와 관련한 문제는 없는지요?

 

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값이 누락될 수 있습니다.


by 마농 [2014.07.10 10:54:07]

시퀀스, 테이블, 인덱스 모두 다 별도의 객체(Object)입니다.
각각이 유기적으로 동작하긴 하지만 각각의 특성은 다릅니다.


시퀀스는 단순하게 유니크한 새 번호를 따기 위한 구조이구요.
시퀀스는 테이블에 종속적이지 않습니다.
테이블 입력시 사용되어질 뿐입니다.


테이블은 데이터를 저장하기 위한 구조입니다.
저장이 주 목적이며, 정렬은 고려하지 않습니다.


인덱스는 테이블의 데이터를 빨리 찾기 위한 구조입니다.
데이터를 빨리 찾기 위해 정렬된 구조를 가지고 있습니다.
인덱스는 테이블에 종속적이죠.


by 김용도 [2014.07.10 13:56:31]

두분다 답변 진심으로 감사드립니다.

이해가 되도록 알려주셔서 많은 도움이 되었습니다.

 

정말 감사드립니다~!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입