AdventureWorks2012 데이터베이스 에서이 쿼리를 실행하고 있습니다 .
SELECT
s.SalesOrderID,
d.CarrierTrackingNumber,
d.ProductID,
d.OrderQty
FROM Sales.SalesOrderHeader s
JOIN Sales.SalesOrderDetail d
ON s.SalesOrderID = d.SalesOrderID
WHERE s.CustomerID = 11077
예상 실행 계획을 보면 다음이 표시됩니다.
초기 색인 탐색 (오른쪽 상단)은 IX_SalesOrderHeader_CustomerID 색인을 사용하고 리터럴 11077을 검색합니다. 추정치는 2.6192 행입니다.
를 사용 DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM
하면 값 11077이 두 개의 샘플링 된 키 11019와 11091 사이에 있음을 보여줍니다.
11019와 11091 사이의 평균 개별 행 수는 2.619718이거나 인덱스 탐색에 대해 표시된 예상 행의 값인 2.61972로 반올림됩니다.
내가 이해하지 못하는 부분은 SalesOrderDetail 테이블에 대한 클러스터형 인덱스 검색의 예상 행 수입니다.
내가 실행하면 DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID')
:
따라서 SalesOrderID의 밀도 (내가 참여하고있는)는 3.178134E-05입니다. 이는 1 / 3.178134E-05 (31465)가 SalesOrderDetail 테이블의 고유 SalesOrderID 값 수와 동일 함을 의미합니다.
SalesOrderDetail에 고유 한 SalesOrderID가 31465 인 경우 고른 분포를 사용하면 SalesOrderID 당 평균 행 수는 121317 (총 행 수)을 31465로 나눈 값입니다. 평균은 3.85561입니다.
따라서 루프를 통과하는 예상 행 수가 2.61972이고 평균이 3.85561로 반환되면 예상 행 수는 2.61972 * 3.85561 = 10.10062라고 생각합니다.
그러나 예상 행 수는 11.4867입니다.
두 번째 추정치에 대한 나의 이해가 잘못되었다고 생각하고 숫자가 다르면 그 사실을 알 수 있습니다. 내가 무엇을 놓치고 있습니까?