ฉันใช้คำค้นหานี้ในฐานข้อมูล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
หากมี SalesOrderID ที่ไม่ซ้ำกัน 31465 รายการใน SalesOrderDetail จากนั้นด้วยการแจกแจงแบบสม่ำเสมอจำนวนแถวเฉลี่ยต่อ SalesOrderID คือ 121317 (จำนวนแถวทั้งหมด) หารด้วย 31465 ค่าเฉลี่ยคือ 3.85561
ดังนั้นถ้าจำนวนแถวที่จะวนซ้ำโดยประมาณคือ 2.61972 และค่าเฉลี่ยที่ส่งคืนใน 3.85561 ฉันจะคิดว่าจำนวนแถวโดยประมาณจะเป็น 2.61972 * 3.85561 = 10.10062
แต่จำนวนแถวโดยประมาณคือ 11.4867
ฉันคิดว่าความเข้าใจของฉันเกี่ยวกับการประมาณการครั้งที่สองนั้นไม่ถูกต้องและตัวเลขที่แตกต่างกันดูเหมือนจะบ่งบอกว่า ฉันกำลังคิดถึงอะไร