2014-02-24 2 views
0

아래의 조건문이 무거운 저장 프로 시저에 있습니다. 행의 25 %에 Visible = 1 기준이 있지만 나머지는 웹 응용 프로그램에서 사용되지 않고 처리 된 참조 만 사용됩니다. 해당 열에 인덱스를 추가하는 것이 유익합니까?성능에 대한 부울 열에 SQL Server 인덱스 추가

WHERE 
    ev.Visible = 1 AND 
    (@StartDate IS NULL OR @StartDate <= ev.StartDate) 
+0

이것은 스스로 테스트 할 수있는 것입니다. 귀하의 데이터가 없습니다. 정확히 * 당신이 찾고있는 것은 무엇입니까? – Kermit

+0

임 (Im)은 그 일을하는 것이 나쁜 습관인지 궁금해한다. 그렇지 않다면 나는 그것을 시도 할 것이다. –

+2

모든 쿼리에 인덱스를 추가하고 싶지는 않습니다. 쿼리가 최적으로 수행되고 있지 않다는 사실을 알게되면 쿼리가 자주 사용되며 인덱스를 사용하면 쿼리의 이점을 누릴 수 있습니다. – Kermit

답변

3

실제 데이터를 테스트하고 결과를 결정하는 것이 가장 좋습니다.

큰 볼륨에서는 25 %의 선택성이 좋지 않습니다. 확인을 위해 데이터를 테스트하십시오. 다른 색인을 필요로하는 다른 종류의 검색을 수행하고있을 것입니다.

몇 가지 옵션이 더 나은이 시나리오를 처리 할 수 ​​있습니다

  • 이 절은 WHERE 사람들의 다른 술어, 당신은 필터링 된 인덱스를 사용하는 것을 고려할 수 있습니다 무엇에 따라. CREATE INDEX [IX_Post_Startdate] ON dbo.Posts(StartDate) WHERE VISIBLE = 1. 그러면 startDate를 기반으로 검색하는 다른 쿼리가 지원됩니다.
  • ALL 쿼리가 동일한 패턴 (표시 가능 = 1 AND ...)을 사용하는 경우 파티셔닝이 좋은 방법 일 수 있습니다.
    • 파티션 기능은 엔터프라이즈 기능이므로 해당 버전을 사용하지 않는 경우 "보이지 않는"행을 일종의 아카이브 테이블로 이동하여 수동으로 데이터를 분할 할 수 있습니다.
  • INSERT/UPDATE/DELETE가 적고 SELECT 문이 많으면 인덱싱 된 뷰를 사용하면 좋은 해결책이 될 수 있습니다.
+0

* "SQL Server는이 경우 단일 인덱스"소스 만 사용합니까? – Kermit

+0

쿼리 당 테이블 당 예. 비 클러스터형 인덱스에서 인덱스 검색을 수행 한 다음 클러스터형 인덱스에서 검색합니다. 추가 인덱스는 사용하지 않습니다. 내가 근원을 찾을 수 있는지 알 것이다. –

+0

내 말에 잘못된 말씨가있어 오류가있는 문구를 삭제했습니다 –