SQL Server 2016の新しいカーディナリティエスティメーター(CE)には不幸な回帰があり、展開に大きな打撃を与えています。問題のクエリは、ありふれたHibernateが生成した更新です。ただし、更新されたテーブルもインデックス付きビューの一部です。これは1行の更新であり、通常、インデックス付きビューの〜5行にも影響します。
この列の現在の統計内のPK値に対してクエリが最初にコンパイルされ、最適な計画が生成された場合、2.5MテーブルのPK列のカーディナリティ推定に問題を絞り込むことができました。
PKがより新しく、統計範囲外である場合、CE 130は非常に最適ではない計画を生成し、本質的にインデックス付きビュー全体が更新の影響を受けると推定します。これは、CE 120またはCE 70の問題では決して発生しませんでした。問題の最初の列は、UNKNOWNとして「ブランド化」されています。
ただし、古いクエリプランナーに使用できるトレースフラグ(2388-90、4139)がいくつかあることはわかりましたが、これらはCE 120+には影響しません。
通常のクエリプランが毎回見つかるようにするために呼び出すことができる新しい設定やトレースフラグはありますか?
私はTF 9481を使用して古いCEを強制的に実行したところ、見事に機能しましたが、これをHibernateと組み合わせるのは困難です(クエリにヒントを挿入するのは難しく、Hibernateの内部をいじりたくありません)。 TF 4199と最新のCUも試しましたが、役に立ちませんでした。
これらのすべてが当てはまる場合:
それから 計画ガイド は良い修正です。これらのルールに違反した場合(クエリが変更され始めた場合など)、プランガイドは機能しません。