안녕하세요.즐거운금요일.
너무 초보적인 질문드려서 미리 죄송합니다.
SQL은 아래와 같습니다.
SELECT AA
FROM TABLE
WHERE AA IN (1, 5, 7)
테이블에는
1
1
1
2
2
3
3
4
4
5
6
6
6
6
7
7
7
7
8
8
총 19로우가 있고요.
제가 궁금한게 인덱스 스캔을 어떻게 할까 너무 궁금해서요..한참을 찾지못하여이렇게 질문을 합니다..ㅜㅜ
1.
처음 RANDOM ACCESS를 수행하여 1를 찾고 8까지 순차적으로 19로우를
RANGE SCAN하면서 WHERE조건에 맞는 1,5,7에 해당하는 값이나왔을때만 추출하는건가요?
2.
아니면 RANDOM ACCESS 1번 로우찾아서 1번에해당하는 3개의로우에 대한 RANGE SCAN 후
다시 RANDOM ACCESS를 하여 5번 로우찾아서 5번에 해당하는 1개의로우에 대한 RANGE SCAN 후
다시 RANDOM ACCESS를 하여 7번 로우찾아서 7번에 해당하는 4개의로우에 대한 RANGE SCAN 를
하여 값을 추출하는건가요...
3. 그리고....지금 저 형태의 TABLE일경우 WHERE AA IN (1,2,3,4,5,6,7,8)과 WHERE BETWEEN 1 AND 8.
일경우엔 차이점이있을까요..제 생각엔..BT가 더 성능면에서 좋을꺼같아서용.
두서없이 어렵게 질문한점 죄송합니다.
감사합니다.
○ 인덱스 컬럼의 IN 절에 대한 수행은 다음 3가지 방식으로 동작합니다.
1. InList iterator
- InList 수만큼 반복하여 Index Scan
2. Concatnation
- InList 수만큼 분할된 쿼리 Union All
3. Range Scan
- Range Scan 하면서 Filter 처리
InList / Concatnation / Range Scan Control 하기
○ Between VS InList
- 불연속 값의 경우엔 IN 이 유리할 수 있습니다.
- 연속값에 대한 경우라면 BT 가 유리할 수 있습니다.