저는 시스템에서 자주 사용되는 쿼리를 최적화하는 중입니다. 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으로 색인을 만드는 기술을 찾지 못했지만 다른 사람들이 무엇을 할 것인지 궁금합니다.
왜 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
또한 (20,30,40)의 카테고리는 다음으로 한정됩니다. OR 조건과의 동일성 비교는 범주가있는 인덱스를 사용합니까? – shashi
단일 열 *에 대한 부등식 비교는 인덱스의 이점을 얻을 수 있습니다. 그러나 색인 [Tipping Point] (http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx) 때문에 위험한 경로입니다. 대부분의 시계열 유형의 데이터는 대다수의 쿼리가 특정 시간 * 간격 * (즉, [범위 스캔]에서 데이터를 요청하기 때문에 (예 :'CreatedOn')을 클러스터 된 인덱스의 가장 왼쪽 키로 사용합니다. http://msdn.microsoft.com/en-us/library/ms177426.aspx)) –