สำหรับสิ่งCOUNT(DISTINCT)
ที่มีค่าแตกต่างกัน ~ 1 พันล้านครั้งฉันได้รับแผนคิวรีที่มีการรวมแฮชที่คาดว่าจะมีแถวเพียง 3 ล้านแถวเท่านั้น
ทำไมสิ่งนี้จึงเกิดขึ้น SQL Server 2012 สร้างการประมาณการที่ดีดังนั้นนี่เป็นข้อบกพร่องใน SQL Server 2014 ที่ฉันควรรายงานเกี่ยวกับการเชื่อมต่อหรือไม่
แบบสอบถามและประมาณการที่ไม่ดี
-- Actual rows: 1,011,719,166
-- SQL 2012 estimated rows: 1,079,130,000 (106% of actual)
-- SQL 2014 estimated rows: 2,980,240 (0.29% of actual)
SELECT COUNT(DISTINCT factCol5)
FROM BigFactTable
OPTION (RECOMPILE, QUERYTRACEON 9481) -- Include this line to use SQL 2012 CE
-- Stats for the factCol5 column show that there are ~1 billion distinct values
-- This is a good estimate, and it appears to be what the SQL 2012 CE uses
DBCC SHOW_STATISTICS (BigFactTable, _WA_Sys_00000005_24927208)
--All density Average Length Columns
--9.266754E-10 8 factCol5
SELECT 1 / 9.266754E-10
-- 1079126520.46229
แผนแบบสอบถาม
สคริปต์เต็ม
นี่คือ Repro เต็มรูปแบบของสถานการณ์โดยใช้สถิติฐานข้อมูลเท่านั้น
สิ่งที่ฉันได้ลองมาแล้ว
ฉันขุดลงไปในสถิติสำหรับคอลัมน์ที่เกี่ยวข้องและพบว่าเวกเตอร์ความหนาแน่นแสดงค่าประมาณ 1.1 พันล้านค่าที่ชัดเจน SQL Server 2012 ใช้การประมาณนี้และสร้างแผนการที่ดี SQL Server 2014 น่าประหลาดใจที่ดูเหมือนจะเพิกเฉยต่อการประมาณการที่แม่นยำมากที่จัดทำโดยสถิติและใช้การประมาณการที่ต่ำกว่าแทน สิ่งนี้สร้างแผนที่ช้ากว่ามากซึ่งไม่ได้สำรองหน่วยความจำเกือบพอและมีการรั่วไหลไปยัง tempdb
ฉันลองตั้งค่าสถานะติดตาม4199
แต่ไม่ได้แก้ไขสถานการณ์ สุดท้ายฉันพยายามที่จะขุดลงไปในข้อมูลเพิ่มประสิทธิภาพผ่านการรวมกันของธงร่องรอย(3604, 8606, 8607, 8608, 8612)
ที่แสดงให้เห็นในช่วงครึ่งหลังของบทความนี้ อย่างไรก็ตามฉันไม่สามารถเห็นข้อมูลใด ๆ ที่อธิบายการประมาณการที่ไม่ดีจนกว่าจะปรากฏในแผนภูมิผลลัพธ์สุดท้าย
เชื่อมต่อปัญหา
จากคำตอบของคำถามนี้ฉันได้ยื่นเรื่องนี้เป็นปัญหาใน Connect