Für einen COUNT(DISTINCT)
mit ~ 1 Milliarde verschiedenen Werten erhalte ich einen Abfrageplan mit einem Hash-Aggregat, das auf nur ~ 3 Millionen Zeilen geschätzt wird.
Warum passiert dies? SQL Server 2012 liefert eine gute Schätzung. Ist dies ein Fehler in SQL Server 2014, den ich bei Connect melden sollte?
Die Abfrage und schlechte Schätzung
-- 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
Der Abfrageplan
Vollständiges Skript
Was ich bisher versucht habe
Ich habe die Statistiken für die relevante Spalte durchgesehen und festgestellt, dass der Dichtevektor geschätzte ~ 1,1 Milliarden verschiedene Werte anzeigt. SQL Server 2012 verwendet diese Schätzung und erstellt einen guten Plan. Überraschenderweise scheint SQL Server 2014 die sehr genaue Schätzung der Statistik zu ignorieren und verwendet stattdessen eine viel niedrigere Schätzung. Dies führt zu einem viel langsameren Plan, der nicht genügend Arbeitsspeicher reserviert und nicht in Tempdb abläuft.
Ich habe trace flag ausprobiert 4199
, aber das hat die Situation nicht verbessert. Zuletzt habe ich versucht, Informationen zum Optimierer über eine Kombination von Ablaufverfolgungsflags abzurufen (3604, 8606, 8607, 8608, 8612)
, wie in der zweiten Hälfte dieses Artikels gezeigt . Ich konnte jedoch keine Informationen sehen, die die schlechte Schätzung erklären, bis sie im endgültigen Ausgabebaum erschien.
Verbindungsproblem
Aufgrund der Antworten auf diese Frage habe ich dies auch als Problem in Connect abgelegt