밑에서 알려주신대로 인덱스를 잡아 놓으니
조건절이 없거나
select num,title,name from table with(nolock)
where idx >0 and title='1' order by idx desc, step ASC
이렇게 하나가 있을대는 index seek가 되는데
select num,title,name from table with(nolock)
where idx >0 and title='1' and name='1' order by idx desc, step ASC
이런식으로 조건절이 더 붙게 되면 그때부터는 index scan이 되버리네요..
이런경우엔 어떻게 해야 하나요?
1.각각의 상황에 맞게 인덱스를 만든다
2.index scan을 감수하고 쓴다
일꺼 같긴 한데 1번같은경우 그럼 조건이 더 늘어나거나 하면 그에 맞춰서 인덱스를 계속 만들어야 하는건지
아니면 나올수 있는 조건을 모두 생각해서 그에 맞춰서 인덱스를 잡아야 하는건지
후자라면
select num,title,name,set from table with(nolock)
where idx >0 and title='1' and name='1' and set='1' and set2='1' or (set3='1' and set='4') order by idx desc, step ASC
이런식은 인덱스를 어떻게 잡아야 할까요?
검색등으로 해결해 보고 싶은데 이런건 어떻게 검색을 해야 할지도 모르겠어서 도와주세요
Comment 2
-
dreamryu
2018.10.05 16:45
-
minsouk
2018.10.06 02:24
1) 아마 오해가 있어 idx > 0 이라는 조건을 계속 넣고 있는듯 합니다.
2) 만약 insert 만 하는 서버라면 인덱스가 많은게 나쁘겠고, select 가 많은 경우는 index 를 다 만들어 주는게 유리하겠죠
3) or 조건이 들어간 쿼리나 무엇보다 크다 작다가 들어가면 그 이후는 모두 scan 으로 될 수 있습니다.
만약 저 조건에 해당하는 건수가 수 건에 불과 하다면, 두 개의 쿼리를 union 으로 합쳐서 다시 sort 해주는게 좋습니다.
결과 건수가 많다면.....한번에 scan 해서 정렬하는게 빠를 수 있습니다.
index 의 정확한 이해만 있다면 아주 쉽게 해결할 수 있습니다. full scan 이 모두 나쁜건 아닙니다. 모두 나쁘다면 기능을 삭제 했겠지요 데이터가 어떻게 들어있고, 어떤 데이터를 추출하는지를 정확한 비즈니스 이해가 있다면 쉽게 인덱스를 생성 할 수 있습니다.
MSSQL에서는 적절한 인덱스가 있더라 하더라고 데이터량 자체가 적은 경우 스켄이 유리하다고 판단하여 스켄이 이루어지는 경우가 있습니다. 테스트 적절하게 많은 데이터(2~3만 row이상) 를 가지고 인텍스 테스트를 하셔야 원하는 실행계획을 확인 하실 수 있습니다.
답변
1. 데이터양이 많은 경우 각쿼리가 FULL SCAN하지 않도록 인덱스를 만들어 줍니다.
2. index scan은 가급적 피해야 합니다. 적절한 index 생성으로 index seek으로 유도해주어야 합니다.