클러스터 된 인덱스별로 테이블의 레코드를 조회하는 데 사용되는보기가 있습니다. 또한 뷰에는 두 개의 큰 테이블과 클러스터 된 인덱스의 데이터를 조회하는 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 서버에서 이것을 보았
우수. 많은 감사합니다. 나는 더 많은 지식을 가진 사람이 내 가정이 틀린 곳을 말해 주길 바랬다. 제 질문은 의도적으로 자극했습니다. 나는 원래 버그 보고서를 추적하고 자신을 비난하려고 많은 시간을 보냈지 만 답을 볼 수 없었습니다. – Raspin