2013-01-11 3 views
1

클러스터 된 인덱스별로 테이블의 레코드를 조회하는 데 사용되는보기가 있습니다. 또한 뷰에는 두 개의 큰 테이블과 클러스터 된 인덱스의 데이터를 조회하는 select 문에 몇 개의 하위 쿼리가 있습니다. [TableB의] 올바르게 [TableB의]에 클러스터되지 않은 인덱스를 사용하여 매우 효율적으로 작업 할 수SQL Server 2005는 절대로 작동하지 않는 실행 계획을 캐시했습니다.

SELECT a, 
(SELECT b FROM tableB where tableB.a=tableA.a) as b 
(SELECT c FROM tableC where tableC.a=tableA.a) as c 
FROM tableA 

대부분의 조회 :

는 거대은이 같은 것이 간단합니다. 그러나 매우 때때로 SQL Server는 실행 계획을 생성 할 때 전달되는 값을 포함하지 않는 [tableB]의 인덱스를 대신 사용했습니다. 따라서 위의 예에 따라 column [a]의 인덱스가 tableB에 있지만 계획은 column [z]가있는 클러스터 된 인덱스를 검색합니다. SQL의 자체 언어를 사용하면 계획의 "술어는 객체와 관련이 없습니다". 이것이 왜 실용적인지 나는 알 수 없다. 결과적으로 SQL이이를 수행 할 때 색인의 모든 레코드를 스캔해야합니다. 인덱스가 존재하지 않을 것이기 때문에 30 초가 걸립니다. 그것은 항상 틀린 것처럼 보입니다.

이전에 본 실행 계획이 올바르지 않은 것처럼 보이는 곳이 있습니까? 나는 어쨌든 질의를 다시 작성할 예정이므로, 내 관심사는 질의 구조에 대해서는 적지 만, SQL이 왜 그렇게 잘못 될지에 관해서는 더 많이 논한다.

때때로 SQL Server는 한 번 작동했던 계획을 선택할 수 있으며 데이터 집합이 변경되면 비효율적이 될 수 있지만이 경우 결코 작동하지 않을 수 있습니다.

추가 정보

  • [TableB의] 400 만 개 기록, 가장 값이 [A]
  • 내가 계획을 생성 된 초기 쿼리를 잡아 지금은없는거야 널 (null)입니다
  • 이러한 쿼리에서는 ColdFusion을 통해 실행하지만 사람에 관심이 시간에 독립적으로 SQL 서버에서 이것을 보았

답변

3

그것은 항상 틀린 것처럼 보입니다.

First Rule of Programming에 관심이있을 수 있습니다. 열 인덱스는 [A]가 TableB의 존재하지만

그래서, 위의 예에 따라, 상기 요금제 대신 열 [Z]를 갖는 클러스터 인덱스 의 검사를한다.

클러스터 된 인덱스에는 항상 모든 행이 포함됩니다. z으로 주문할 수는 있지만 리프 레벨에는 다른 모든 열이 계속 포함됩니다.

SQL Server가 때때로 인덱스 검색보다 클러스터 된 검색을 선호하는 이유는 다음과 같습니다. 인덱스 검색을 수행 할 때 인덱스에없는 열을 검색하려면 클러스터 된 인덱스에 대한 책갈피 조회를 따라야합니다.

클러스터 된 인덱스 검색을 수행 할 때 정의에 따라 모든 열을 찾습니다. 이는 책갈피 조회가 필요 없음을 의미합니다.

SQL Server는 많은 행을 예상 할 때 책갈피 조회를 피하려고합니다. 이것은 오랜 시간 검증 된 선택입니다.비 클러스터형 인덱스 검색은 클러스터 된 인덱스 검색으로 일상적으로 해결됩니다.

with (index(IX_YourIndex)) query hint을 사용하여 케이스를 테스트 할 수 있습니다.

+0

우수. 많은 감사합니다. 나는 더 많은 지식을 가진 사람이 내 가정이 틀린 곳을 말해 주길 바랬다. 제 질문은 의도적으로 자극했습니다. 나는 원래 버그 보고서를 추적하고 자신을 비난하려고 많은 시간을 보냈지 만 답을 볼 수 없었습니다. – Raspin

관련 문제