많은 테이블 (10-11)에 조인하는 상당히 복잡한 저장 프로 시저를 디버깅하려고합니다. 나는 트리의 일부분에 대해 예상되는 행 수가 실제 행 수와 크게 다르다는 것을 알게되었다. 최악의 SQL 서버는 실제 행 수가 55,000 행이 반환 될 때 1 행이 반환 될 것이라고 추정한다!SQL 서버는 예상 행 수를 어떻게 산출합니까?
필자는 왜 모든 통계가 최신인지를 알아 내려고 노력하고 있으며 여러 테이블에서 FULLSCAN으로 통계를 업데이트했습니다. 사용자 정의 함수 나 테이블 변수를 사용하지 않습니다. 늘어나는만큼 SQL 서버가 얼마나 많은 행이 반환 될지 정확하게 예측할 수 있어야하지만, 수만 개의 RDI 조회를 수행하는 계획을 계속 선택합니다 (1 개만 수행 할 것으로 예상되는 경우). 또는 2).
추정 행 수가 너무 많은 이유를 이해하고 시도하려면 어떻게해야합니까?
UPDATE : 그래서 suspicous 보인다 나는 특히 하나 개의 노드를 찾은 계획보고 - 그 테이블은 다음 predecate 사용하여 테이블에 스캔 :
status <> 5
AND [type] = 1
OR [type] = 2
이 술어는 전체 테이블을 반환합니다 (630 개의 행 - 테이블 자체는 성능이 좋지 않은 원본을 스캔합니다.) 그러나 SQL Server는 예상되는 행 수가 37에 불과합니다. SQL 서버는 이와 함께 여러 중첩 루프를 수행하여 RDI 조회, 인덱스 스캔 및 색인을 수행합니다 찾는다. 이것이 내 거대한 계산 착오의 원천이 될 수 있을까? 더 현명한 행 수를 계산하려면 어떻게해야합니까? 이미 통계를 업데이트하기 때문에
당신이 당신의 테이블 정의를 게시하시기 바랍니다 수와 전체 쿼리를 해결할 수 있습니다 귀하의 인덱스를 다시? – Quassnoi
죄송합니다. 실제로는 아니지만 - 너무 커서 (250 행 sp + 10 테이블). – Justin
당신의 술어가 정확히 (괄호가없는) 그런 경우 논리 문제가있을 수 있습니다. AND는 OR보다 우선합니다. [상태] <> 5 AND (유형 = 1 또는 유형 2) – GilaMonster