컬럼 약 25개(INT 위주) 인 테이블에
time 컬럼에 논클러스터드,논유니크로 인덱스가 1개 걸려있는 상황인데
Time을 조건으로 걸고 쿼리를 날리면 테이블스캔을 진행합니다
이후 찾아보니까 강제로 인덱스를 걸면 그때야 인덱스스캔을 하고
Select를 * 이아닌 Time만 진행하면 또 다르게 인덱스를 타네요
원인이 무엇인지 모르겠습니다
Comment 2
-
이리
2021.01.29 09:15
-
지나가는초보
2021.06.15 18:08
index seek 비용이 비싸다고 판단된 원인은 아무래도 select절의 * 때문일 것 같습니다.
현재 nonclustered index로 time 컬럼만 지정되어 있으니 그 이외의 컬럼 데이터를 조회하려면 lookup이 많이 발생하게 됩니다.
조건에 해당되는 row가 적다면 문제되지 않겠지만 row가 많다면 테이블 스캔보다 비용이 비싼 것으로 판단되었을 것 같습니다.
2가지 해답이 있겠습니다.
1. 조건에 해당되는 row가 많다면 clustered index로 변경을 고민
2. 조회하려는 컬럼을 include index(포괄 열 인덱스) 설정
cmd_comment_vote_user Upvote0 Downvote0 Comment Update Delete
index seek가 항상 효율적이진 않습니다.
올려주신 내용만 봤을때는 optimizer가 lookup 비용이 더 비싸다고 판단해서 스캔을 하는것 같습니다.
SET STATISTICS IO ON 하시고 쿼리를 실행 하셔서 논리적 읽기 수 비교를 해보시거나
profiler로 실행하는 쿼리를 잡아서 Reads를 비교해 보세요