以下のためにCOUNT(DISTINCT)
〜10億の異なる値を持っている、私は約3万行を持っていると推定ハッシュ集計でクエリプランを取得しています。
なんでこんなことが起こっているの?SQL Server 2012は適切な見積もりを生成しますが、これはSQL Server 2014のバグであり、Connectで報告する必要がありますか?
クエリと貧弱な見積もり
-- 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に十分なメモリとスピルがほとんど確保されない、はるかに遅いプランが作成されます。
トレースフラグを試しました4199
が、それで状況は修正されませんでした。最後に、この記事の(3604, 8606, 8607, 8608, 8612)
後半で示されているように、トレースフラグの組み合わせを使用してオプティマイザー情報を掘り下げようとしました。しかし、最終的な出力ツリーに表示されるまで、悪い推定値を説明する情報を見ることができませんでした。
接続の問題
この質問への回答に基づいて、これをConnectの問題として提出しました。