Я виконую цей запит у базі даних 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) дорівнює кількості унікальних значень SalesOrderID у таблиці SalesOrderDetail.
Якщо в SalesOrderDetail є 31465 унікальних SalesOrderID, то при рівномірному розподілі середня кількість рядків на SalesOrderID становить 121317 (загальна кількість рядків), поділене на 31465. Середнє значення - 3.85561
Отже, якщо передбачувана кількість рядків, які потрібно пройти через цикл, становить 2,61972, а середнє значення, яке потрібно повернути в 3,85561, я думаю, що приблизна кількість рядків буде 2,61972 * 3,85561 = 10,10062.
Але орієнтовна кількість рядків - 11,4867.
Я думаю, що моє розуміння другої оцінки невірно, і, здається, різні цифри вказують на це. Що я пропускаю?