データ ウェアハウス データベースを使用していますが、SQL Server 2014 の新しいカーディナリティ エスティメーターの問題に直面しています。
データベース サーバーを SQL Server 2014 にアップグレードした後、クエリのパフォーマンスに大きな違いがあることがわかりました。一部のクエリの実行が大幅に遅くなります (SQL 2012 では 30 秒、SQL 2014 では 5 分)。実行計画を調査した後、SQL Server 2014 でのカーディナリティの見積もりがかなりずれており、その理由を見つけることができないことがわかりました。
SQL 2012 と SQL 2014 のクエリ実行プラン (左上の演算子) の例を次に示します。
いくつかの詳細:
私のクエリは、典型的なデータ ウェアハウスのファクト テーブル ロード クエリです。トランザクション テーブルにクエリを実行し、多数 (15 ~ 20) のディメンション テーブルを結合します (ディメンション テーブルから結合されるレコードは常に 0 または 1 です)。
統計が最新であることを確認するために、(FULLSCAN を使用して) すべてのテーブルの統計を更新しました。
ディメンション テーブルのビジネス キーにはインデックスが付けられます (一意の非クラスター化インデックス)。このインデックスの一意性のために、古い基数推定器 (SQL 2012) は最大があると正しく想定しているように思えます。結合する 1 つのレコード (実行計画でレコードの推定数は変わりません)。
問題を最も単純な例に絞り込もうとしました - 2 つの結合を持つ SELECT:
SQL 2012 と SQL 2014 での演算子 1 と 2 のカーディナリティの見積もりは次のとおりです。
| Est.rows - SQL2012 | Est.rows - SQL2014
Operator 1 | 7653 | 7653
Operator 2 | 7653 | 10000
ご覧のとおり、SQL Server 2014 は見積もりを 30% 以上下回っています (10000 対 7653)。私はcaを持っているので。典型的なクエリで 15 ~ 20 の結合が行われると、最終的な見積もりは大きく外れます。
データベースを下位の互換性モード (110) にすると正常に動作しますが (SQL Server 2012 と同じ)、この動作の理由を知りたいです。SQL Server 2014 のカーディナリティ エスティメータの結果が間違っているのはなぜですか?