ในขณะนี้ฉันกำลังพยายามหาวิธีที่ SQL Server จะประเมินความสำคัญของช่วงของเพรดิเคตที่ครอบคลุมขั้นตอนฮิสโตแกรมบางส่วน
บนอินเทอร์เน็ตด้วยความคิดเชิงสถิติสำหรับการคำนวณแบบตามลำดับขั้นและสถิติที่มีค่าฉันพบคำถามที่คล้ายกันและ Paul White ให้คำตอบที่น่าสนใจ
ตามคำตอบของ Paul สูตรการประมาณค่า cardinality สำหรับ predicates> = และ> (ในกรณีนี้ฉันสนใจเฉพาะรุ่นตัวประมาณ Cardinality อย่างน้อย 120) ดังนี้:
สำหรับ>:
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1)))
สำหรับ> =:
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1))
ฉันทดสอบแอปพลิเคชันของสูตรเหล่านี้ในตาราง[การผลิต]. [TransactionHistory]ตารางของฐานข้อมูลAdventureWorks2014ตามกริยาช่วงโดยใช้คอลัมน์TransactionDateและช่วงวันที่และเวลาระหว่าง '20140614' และ '20140618'
สถิติสำหรับขั้นตอนฮิสโตแกรมของช่วงนี้มีดังนี้:
ตามสูตรฉันคำนวณ cardinality สำหรับข้อความค้นหาต่อไปนี้:
SELECT COUNT(1)
FROM [AdventureWorks2014].[Production].[TransactionHistory]
WHERE [TransactionDate] BETWEEN '20140615 00:00:00.000' AND '20140616 00:00:00.000'
การคำนวณดำเนินการโดยใช้รหัสต่อไปนี้:
DECLARE @predStart DATETIME = '20140615 00:00:00.000'
DECLARE @predEnd DATETIME = '20140616 00:00:00.000'
DECLARE @stepStart DATETIME = '20140614 00:00:00.000'
DECLARE @stepEnd DATETIME = '20140618 00:00:00.000'
DECLARE @predRange FLOAT = DATEDIFF(ms, @predStart, @predEnd)
DECLARE @stepRange FLOAT = DATEDIFF(ms, @stepStart, @stepEnd)
DECLARE @F FLOAT = @predRange / @stepRange;
DECLARE @avg_range_rows FLOAT = 100.3333
DECLARE @distinct_range_rows INT = 3
DECLARE @EQ_ROWS INT = 0
SELECT @F AS 'F'
--for new cardinality estimator
SELECT @EQ_ROWS + @avg_range_rows * (@F * (@distinct_range_rows - 1) + 1) AS [new_card]
หลังจากคำนวณฉันได้ผลลัพธ์ดังนี้
ตามสูตรปรากฎเป็น 150.5 แต่เครื่องมือเพิ่มประสิทธิภาพประมาณการส่วนที่ 225.75 แถวและถ้าคุณเปลี่ยนขอบบนของภาคแสดงเป็น '20140617' เครื่องมือเพิ่มประสิทธิภาพจะประเมินแถวที่ 250.833 แล้วในขณะที่ใช้สูตรที่เราได้รับเท่านั้น 200.6666 แถว
โปรดบอกฉันว่า Cardinality Estimator ประเมินในกรณีนี้ได้อย่างไรฉันอาจทำผิดพลาดที่ไหนสักแห่งในการทำความเข้าใจสูตรที่ยกมา?