인덱스 생성하는데 질문이 있습니다.
인덱스 생성하기에 적합한 조건들이 많이 있잖아요.
보통 보면 분포도가 높지 않은 컬럼에는 인덱스를 생성하지 않는게 좋다고 들었습니다.
예) Y 혹은 N 등의 FLAG 값이나 한두가지 코드값을 갖는 컬럼 등
검색 조건이 현재 위에 말한 flag값을 같는 컬럼과 날짜 컬럼이 있습니다.
분포도가 낮다고 하더라도 결합인덱스에 해당 컬럼을 사용하면 효과가 있을까요?
대략 아래와 같습니다..
WHERE flag = 'Y'
AND regdate >= ? and regdate < getdate()
이런 경우 regdate에만 인덱스(클러스터인덱스)를 주는게 좋을까요
결합인덱스를 주는게 좋을까요..
만약 결합인덱스를 준다면 클러스터로 가능한지도 알고싶습니다.
데이터량 별로 많지않고 입력 수정 조회가 빈번하게 일어납니다.
Microsoft SQL Server 2008 sp2 스탠다드입니다.
감사합니다.
Comment 2
-
향지
2013.12.19 13:54
-
한태
2016.03.07 20:59
조회가 자주 일어나면 결합인덱스를 사용하는 것이 좋을 것이라 생각됩니다.
SQL 성능 요소 중 하나는 '처리 범위의 양' 입니다.
단일인덱스를 사용하여 regdate를 인덱스로 이용하면 처리 범위는 regdate에 의해서만 감소하게 됩니다. 따라서 조건에 해당하는 regdate 값을 모두 액세스 할 것입니다.
결합인덱스를 이용한다면 regdate 조건 중 flag가 Y인 값만 액세스 하게되어 처리 범위가 감소하여 성능이 향상될 것입니다.
둘 중 순서를 정한다면 점조건인 flag를 먼저 사용하여 '점+선분' , 두 조건에 의해 모두 처리 범위가 감소하게 만들면 될 것 같습니다.
물론 상황에 따라 다를 것입니다. 데이터량이 별로 많지않고 입력,수정,조회가 빈번하면 인덱스로 인한 효과가 극명하지 않을 수도 있기에 직접 확인하시는 방법이 가장 좋을 것이라 생각됩니다.
클러스터드 인덱스 키를 flag, regdate로 주면 검색 범위가 줄어들수 있지만 성능이 많이 좋아지진 않을것 같습니다.
대충 Y:N 비율이 같다고 하면 select하는 여러 비용 중에서 반정도 검색 범위가 줄겠죠
정확한 상황을 봐야겠지만
select만 조금 더 빨라지고 나머지 작업이 조금씩 느려질수도 있습니다.
인덱스 키를 flag, regdate로 잡았을때의 이득과, 손해 비용을 잘 계산하셔서 차이가 좀 나면 결합으로 잡아도되지만....
차이가 별로 나지 않는다면 구지 flag 컬럼을 추가로 인덱스 잡으시지 않아도 될것 같습니다.