对于COUNT(DISTINCT)
具有约10亿个不同值的,我正在获得一个查询计划,该计划的哈希汇总估计只有300万行。
为什么会这样呢?SQL Server 2012提供了一个很好的估计,所以这是我应该在Connect上报告的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
查询计划
完整脚本
到目前为止我尝试过的
我对相关列的统计数据进行了挖掘,发现密度向量显示出约11亿个不同的值。SQL Server 2012使用此估计并制定了一个好的计划。令人惊讶的是,SQL Server 2014似乎忽略了统计数据提供的非常准确的估计,而是使用了低得多的估计。这将产生一个慢得多的计划,该计划无法保留几乎足够的内存并溢出到tempdb。
我尝试了trace flag 4199
,但是并不能解决问题。最后,我尝试通过跟踪标记的组合来挖掘优化器信息(3604, 8606, 8607, 8608, 8612)
,如本文后半部分所示。但是,直到它出现在最终输出树中之前,我看不到任何信息来解释该错误的估计。
连接问题
基于此问题的答案,我也将此问题作为Connect中的一个问题