인덱스 스캔에 대해서 여쩌봅니다.. 0 2 1,233

by 그루비민욱 [DB 기타] 인덱스 스캔 인덱스스캔 [2015.07.03 10:24:13]


안녕하세요.즐거운금요일.

너무 초보적인 질문드려서 미리 죄송합니다.

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가 더 성능면에서 좋을꺼같아서용.

두서없이 어렵게 질문한점 죄송합니다.

감사합니다.

by 마농 [2015.07.03 10:57:54]

○ 인덱스 컬럼의 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 가 유리할 수 있습니다.

Inlist Iterator를 사용하지 말아야 할 때


by 쿼리back [2015.07.03 11:02:38]

1.  b tree index 형태로 1을 찾는다 ,  5를 찾는다 , 7을 찾는다. (iterator)

2. 1을찾고, 양방향 링크가 되므로 1이 아닐때까지 찾고, 다음값이 1이아니면 빠져나온다.. 5, 7 도 마찬가지..

3. 저런 형태는 BETWEEN 이 더 빠름, B TREE INDEX 를 보면,  IN은 위에서부터 찾는것이고, BETWEEN 은 1찾은후, 링크형태로 검색이 가능하기 때문임...

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