2012-04-05 2 views
1

저는 시스템에서 자주 사용되는 쿼리를 최적화하는 중입니다. WHERE 절은 이미DateTime 열을 키로 사용하여 비 클러스터형 인덱스 만들기

WHERE J.Visibility > 11 
and J.isactive='true' 
and J.isdeleted='false' 
AND (
     CutOffDate > '2012-04-05 00:00:00.000' 
     OR J.CreatedOn > '2011-10-08 00:00:00.000' 
    ) 
AND J.Country = 'India' 
AND J.City='Bangalore' 
AND (J.Type > 0 AND J.Type < 230) 
AND J.Category in (20) 

노스 캐롤라이나 지수 도시, 유형, 가시성,이 isActive와 (INDEX1)와 유사하다, isDeleted를가 존재했다. 위의 필드로 새로운 NC 인덱스를 만들었지 만 CreatedOn, CutOffDate 및 Category를 처음에 추가했습니다.

따라서 새 색인 (색인 2)의 키는 City, Category, CreatedOn, CutOffDate, Type, Visibility 등이었습니다. CreatedOn과 CutOffDate는 모두 내림차순이었습니다. 그러나 쿼리를 실행했을 때 실제 실행 계획은 여전히 ​​Index2가 아니라 Index1의 인덱스 스캔을 수행했습니다. 주어진 DateTime 조건을 감안할 때 Index2가 더 나은 선택 일 것이고 Index seek이 발생할 것이라고 생각했을 것입니다. 그러나 그런 일은 일어나지 않았습니다.

왜 이런 일이 벌어 질 수 있는지 조사하면서 this MS article을 보았습니다. 이제 datetime의 색인을 기사에서 언급 한 것처럼 작성해야하는지 궁금합니다. Google에서 검색 할 때 다른 곳에서 언급 한 datetime으로 색인을 만드는 기술을 찾지 못했지만 다른 사람들이 무엇을 할 것인지 궁금합니다.

답변

2

정확한 색인 정의 란 무엇입니까? (City, Category, CreatedOn, CutOffDate, Type, Visibility)의 색인은 사용자 검색어에 사용할 수 없습니다. 사실, 두 필드에서 부등식 비교 (>)를 사용하는 조건이 있고 조건 사이에 OR 조건이 있으면 비교의 datetime 부분을 도울 수있는 색인이 없습니다. 링크 한 기사는 문제와 관련이 없습니다.

좋은 인덱스를 제안하려면 테이블 정의, 사용하는 정확한 쿼리 및 각 열의 카디널리티 (고유 값 수)를 정확하게 알려줘야합니다.

+0

왜 Index2가 Index2에서 선택되었고 내가 잘못된 흔적을 스니핑했는지 설명합니다. 하지만 필드 및 OR 조건 중 하나를 제거하면 datetime 인덱스를 사용할 때 도움이됩니까? where 절의 조건은 사용자가 앱에서 선택한 선택 사항에 따라 다릅니다. 나는 정말로 모든 세부 사항을 여기에서 줄 수 없을 것이다. 그러나 테이블에는 250,000 개가 넘는 행이 있고 CreatedOn> Date는 약 40,000 개의 행으로 연결됩니다. 따라서 CreatedOn이있는 인덱스를 사용하려고했습니다. 또한, http://stackoverflow.com/questions/10028225/which-where-condition-on-datetime-will-be-faster 변경 사항은 그랬습니다 – shashi

+0

또한 (20,30,40)의 카테고리는 다음으로 한정됩니다. OR 조건과의 동일성 비교는 범주가있는 인덱스를 사용합니까? – shashi

+0

단일 열 *에 대한 부등식 비교는 인덱스의 이점을 얻을 수 있습니다. 그러나 색인 [Tipping Point] (http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx) 때문에 위험한 경로입니다. 대부분의 시계열 유형의 데이터는 대다수의 쿼리가 특정 시간 * 간격 * (즉, [범위 스캔]에서 데이터를 요청하기 때문에 (예 :'CreatedOn')을 클러스터 된 인덱스의 가장 왼쪽 키로 사용합니다. http://msdn.microsoft.com/en-us/library/ms177426.aspx)) –

관련 문제