web-dev-qa-db-ja.com

SQL 2016(新しいCE)で昇順のキーが不正な計画を取得し、TF 4139などの代替品ですか?

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も試しましたが、役に立ちませんでした。

6
user22674

これらのすべてが当てはまる場合:

  • 比較的限られた数のクエリ(数十から数百)を修正するだけで済みます。
  • あなたはそれらが何であるかを正確に知っており、T-SQLを入手することができます
  • それらは変更されません(エンドユーザーは動的に独自に構築したり、検索条件を追加したりできません)
  • あなたは彼らが変わらないことを保証することができます
  • どのコンテキストで実行するかを制御できます(たとえば、ユーザーデータベースを指す完全修飾オブジェクト名でTempDBで実行されていません)。
  • それらは限られた数のデータベースにあります(すべてのクライアントが独自のデータベースにあり、すべてのデータベースのすべてのクエリを修正したい場合のソフトウェアとしてのサービスのアプローチとは対照的)

それから 計画ガイド は良い修正です。これらのルールに違反した場合(クエリが変更され始めた場合など)、プランガイドは機能しません。

2
Brent Ozar