web-dev-qa-db-ja.com

クエリオプティマイザーによって生成された候補実行プランを確認する方法はありますか?

クエリオプティマイザーは、複数の実行プランを作成します。実行されたプランが選択される前に生成されたすべてのプランをどのように確認できますか?

Microsoftによると

クエリオプティマイザーは、可能なプランを分析し、見積もりコストが最も低いプランを選択する必要があります。

実行プランのキャッシュと再利用 のことではないことに注意してください。候補の実行プラン、つまり生成されたが実行するように選択されていないものについて話しているのです。

Benjamin Nevarezの記事によると SQL Server Query Optimizer

候補実行プランの生成は、変換ルールを使用してクエリオプティマイザー内で実行され、ヒューリスティックを使用すると、最適化時間を合理的に保つために考慮される選択肢の数が制限されます。候補プランは、メモと呼ばれるコンポーネントの最適化中にメモリに保存されます。

私たちができる方法でレンダリングされた候補計画を視覚化することは可能でしょうか 実際の実行計画を表示する

10
Ronaldo

オプティマイザは、計画と部分的な計画を完全に探索する前に、検索でこれまでに見つかった現在の最良のソリューションよりも悪いと考えられる場合、それらを破棄することによって、検索時間を短縮する発見的方法を備えています。したがって、実際にはすべての代替案が完全に生成されるわけではありません。また、XML表現は実際には検索の最後に生成されるものです。内部表現は多少異なります。残念ながら、同じクエリに対して他の可能なプランを探索するための現在の公開機能はありません。デバッガーを使用すると、最適化プロセス中にこれらすべてを保持する構造を確認できます。それはメモと呼ばれています。 SQLのオプティマイザーのベースとなっているCascadesフレームワークについて詳しく読むことができます here

13

私の知る限り、最終的に破棄された候補プランのグラフィカル/ XML実行プランを確認する方法はありません。特定の計画の形が予想される場合の1つのアプローチは、ヒントを使用してから、原価計算を比較して、ヒント付き計画よりも最終計画が選ばれた理由を確認することです。

たとえば、特定の非クラスター化インデックスがクエリの一部に使用されることを期待しているかもしれませんが、最終計画は代わりにクラスター化インデックスをスキャンします。 WITH (INDEX (IX_Your_Index))テーブルヒントをクエリに追加すると、そのインデックスでどのようになるかを示すことができます。この目的に使用できるヒントはたくさんあります。ヒント索引と結合については、多くのオプションがあります。

完全な実行プランは別にして、最適化プロセス、オプティマイザによるクエリの変換方法、考慮され、選択または破棄されるさまざまなプランフラグメントの詳細を確認する方法があります。 Paul Whiteの Query Optimizer Deep Dive シリーズでは、これについてかなり詳しく説明しています。

クエリの「論理ツリー」がどのように変換および簡略化されるかを視覚化したい場合(Paulのシリーズのパート1で説明)、そのための便利な無料ツールがあります。 SQL Server Query Tree Viewer

シリーズのパート3では、「中間」計画と、オプティマイザのメモデータ構造を介してそれらに関するいくつかの情報を表示する方法について説明します。

特に簡単なことはありませんが、計画が他の計画よりも優先される理由を理解するのに役立ちます。とにかく、私は上記のリンクされた記事のすべてがとにかく非常に興味深いと思いますか????

12
Josh Darnell