Para un COUNT(DISTINCT)
que tiene ~ 1 mil millones de valores distintos, obtengo un plan de consulta con un agregado de hash que se estima que tiene solo ~ 3 millones de filas.
¿Por qué está pasando esto? SQL Server 2012 produce una buena estimación, entonces, ¿es un error en SQL Server 2014 que debo informar sobre Connect?
La consulta y estimación pobre
-- 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
El plan de consulta
Guión completo
Lo que he probado hasta ahora
Revisé las estadísticas de la columna relevante y descubrí que el vector de densidad muestra un estimado de ~ 1,1 mil millones de valores distintos. SQL Server 2012 usa esta estimación y produce un buen plan. Sorprendentemente, SQL Server 2014 parece ignorar la estimación muy precisa proporcionada por las estadísticas y, en cambio, utiliza una estimación mucho más baja. Esto produce un plan mucho más lento que no reserva memoria suficiente y se derrama a tempdb.
Intenté rastrear la bandera 4199
, pero eso no solucionó la situación. Por último, traté de profundizar en la información del optimizador mediante una combinación de marcas de seguimiento (3604, 8606, 8607, 8608, 8612)
, como se demostró en la segunda mitad de este artículo . Sin embargo, no pude ver ninguna información que explicara la mala estimación hasta que apareció en el árbol de salida final.
Problema de conexión
Según las respuestas a esta pregunta, también lo presenté como un problema en Connect