SQL Server 2014 COUNT (DISTINCT x) ละเว้นเวกเตอร์ความหนาแน่นของสถิติสำหรับคอลัมน์ x


15

สำหรับสิ่ง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

คำตอบ:


14

วิธีที่การประเมินความเป็นหัวใจได้มาจากฉันอย่างแน่นอน การคำนวณการนับที่แตกต่าง (สามารถดูได้ด้วย Extended Events หรือค่าสถานะการติดตาม 2363 และ 3604) คือ:

สถิติที่ได้มา

สังเกตหมวก ตรรกะทั่วไปของสิ่งนี้ดูเหมือนว่าสมเหตุสมผลมาก (ไม่สามารถมีค่าที่แตกต่างกันได้มากกว่า) แต่จะใช้ค่าสูงสุดจากสถิติหลายคอลัมน์ตัวอย่าง :

DBCC SHOW_STATISTICS 
    (BigFactTable, [PK_BigFactTable])
WITH
    STAT_HEADER, 
    DENSITY_VECTOR;

สถิติ PK

นั่นแสดง 2,980,235 แถวสุ่มตัวอย่างจาก 3,439,431,721 กับเวกเตอร์ความหนาแน่นที่ระดับ Col5 3.35544E-07 ส่วนกลับของที่ให้จำนวนของค่าที่แตกต่างของ 2,980,235 ปัดเศษโดยใช้คณิตศาสตร์จริงถึง 2,980,240

ตอนนี้คำถามคือจากสถิติตัวอย่างสิ่งที่สมมติฐานที่แบบจำลองควรทำเกี่ยวกับจำนวนค่าที่แตกต่างกัน ฉันคาดหวังว่ามันจะคาดการณ์ แต่ก็ยังไม่เสร็จและอาจจงใจ

ฉันคาดว่าแทนที่จะใช้สถิติหลายคอลัมน์มันจะดูความหนาแน่นของ Col5 (แต่ไม่ใช่):

DBCC SHOW_STATISTICS 
    (BigFactTable, [_WA_Sys_00000005_24927208])
WITH
    STAT_HEADER, 
    DENSITY_VECTOR;

สถิติ Col5

นี่คือความหนาแน่น 9.266754E-10 ซึ่งกันและกันซึ่งเป็น1079126528

วิธีแก้ไขปัญหาหนึ่งที่ชัดเจนในระหว่างนี้คือการปรับปรุงสถิติหลายคอลัมน์ด้วยการสแกนแบบเต็ม อีกข้อหนึ่งคือการใช้ตัวประมาณค่าเชิงการนับดั้งเดิม

รายการเชื่อมต่อที่คุณเปิดSQL 2014 สุ่มตัวอย่างหลายคอลัมน์สถิติแทนที่คอลัมน์คอลัมน์เดี่ยวที่มีความแม่นยำมากกว่าสำหรับคอลัมน์ที่ไม่นำหน้าถูกทำเครื่องหมายคงที่สำหรับ SQL Server 2017

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.