Untuk COUNT(DISTINCT)
yang memiliki ~ 1 miliar nilai berbeda, saya mendapatkan paket permintaan dengan agregat hash yang diperkirakan hanya ~ 3 juta baris.
Mengapa ini terjadi? SQL Server 2012 menghasilkan estimasi yang baik, jadi apakah ini bug di SQL Server 2014 yang harus saya laporkan pada Connect?
Kueri dan taksiran yang buruk
-- 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
Paket kueri
Skrip lengkap
Berikut adalah repro penuh situasi menggunakan hanya statistik statistik .
Apa yang saya coba sejauh ini
Saya menggali statistik untuk kolom yang relevan dan menemukan bahwa vektor kepadatan menunjukkan sekitar ~ 1,1 miliar nilai yang berbeda. SQL Server 2012 menggunakan estimasi ini dan menghasilkan rencana yang baik. SQL Server 2014, secara mengejutkan, tampaknya mengabaikan estimasi yang sangat akurat yang disediakan oleh statistik dan sebagai gantinya menggunakan estimasi yang jauh lebih rendah. Ini menghasilkan rencana yang jauh lebih lambat yang hampir tidak mencadangkan cukup memori dan tumpah ke tempdb.
Saya mencoba melacak bendera 4199
, tetapi itu tidak memperbaiki situasi. Terakhir, saya mencoba menggali informasi pengoptimal melalui kombinasi tanda jejak (3604, 8606, 8607, 8608, 8612)
, seperti yang ditunjukkan pada paruh kedua artikel ini . Namun, saya tidak dapat melihat informasi yang menjelaskan perkiraan buruk sampai muncul di pohon hasil akhir.
Hubungkan masalah
Berdasarkan jawaban atas pertanyaan ini, saya juga telah mengajukan ini sebagai masalah di Connect