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

by 그루비민욱 [DB 기타] [2015.07.17 17:08:17]


안녕하세요 그루비 회원님들.

제가 지금 튜닝작업중인데 한가지 제 뜻대로 되지않는게있어서요(물론 한가지만 있는건아닙니다.)

다름이 아니고 A라는 테이블에 삼백만건 정도의 테이터가있는데

수량있는 로우만 찾고싶어서 제가 수량필드만 넣어서 인덱스를 생성하였습니다.

수량이있는 필드는 고작 6000건 정도밖에안되거든요.

그래서

SELECT PONUM

FROM A

WHERE 수량 > 0

이렇게 해서 데이터를 좀 빠르게 추출하고싶었는데

생각보다 오래걸려서 인데스 전체를 풀스캔하는건 아닌가싶어서 여쩌봅니다.

실행계획에 보면은 RANGE INDEX SCAN으로 실행되어있거든요..

예를 들어 인덱스 값이 

수량
0
0
0
0
0
0
0
0
0
1
1
2
2
2
2
2
2
4
5
5
6

6

제생각엔 인덱스는 위와 같이 생성되어있을꺼같고요. 실행시 랜덤액세스를 형식으로 1을 찾은다음 RANGES 스캔을 할꺼같은데.그럼 굉장히 빨리 나오지않을까 해서 저렇게 인덱스 구성과 SQL를 활용했던거거든요.

 

제생각이 맞지않을까요.?그리고 저럴경우엔 혹시 어떻게 튜닝이 가능할까요..

 

두서없이 쓴점 죄송하고,읽어주셔서 감사합니다 :)

즐거운 주말되세영!

 

by 마농 [2015.07.20 10:34:11]

일단 생각하신 내용과 시도는 맞는것 같습니다.
(수량 > 0) 대신 (수량 >= 1) 가 좀더 범위를 줄여줄듯 하지만... 큰 영향은 없을 것으로 봅니다.
실행계획상 인덱스범위스캔이 나온걸로 봐서는 의도한대로 된 것 같구요.
실제 쿼리가 위에 예로 드신 쿼리보다 훨씬 복잡한 것은 아닐런지?
다른데서 원인을 찾아보세요.


한가지 생각할 수 있는 것은 테이블 램덤엑세스에 대한 부담입니다.
SELECT 수량 FROM a WHERE 수량 > 0; <- 인덱스만 스캔
SELECT 다른항목 FROM a WHERE 수량 > 0; <- 인덱스만 스캔후 테이블 램덤엑세스
수량이 0 보다 큰 것의 테이블 블럭 저장 순서는 뒤죽박죽일터이니
6천번 렌덤 엑세스 하는게 부담일 수 있습니다.
인덱스를 수량만으로 생성하지 마시고(수량, 조회항목)의 복합키로 생성하세요.

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