web-dev-qa-db-ja.com

十分な計画のないクエリが見つかりました

SQL Server 2012データベースがあります。一部のクエリでReason for early termination of statement optimizationの値に気づき、すべてGood Enough Plan Foundを提供しました。今私の質問は:

  1. 「ステートメント最適化の早期終了の理由」のすべての可能なタイプは何ですか。私はこれをmsdnで検索しましたが、値の完全なリストを取得できませんでした。
  2. Good Enough Plan Found以外の理由で最適化が終了したすべてのクエリをリストするDMVまたは拡張イベントはありますか?可能性の完全なリストをリストしていない以下の2つの記事を参照しました。 [また、私のデータベースでは結果が異なります]。

enter image description here

21
LCJ
  • メモリ制限を超えました

    オプティマイザは、メモリのプレッシャーのため、より適切な代替案を探すことをやめざるを得ませんでした。その理由を調査して修正してから、クエリのコンパイルを再試行してください。返されたプランは、メモリ不足状態が存在しなかった場合にオプティマイザが選択したプランとは異なる場合があります。

  • タイムアウト

    この理由は非常に誤解されているです。

    クエリオプティマイザーは合理的なプランをすばやくを見つけることを目的としています。最善の計画を見つけるための徹底的な検索は行いません。設計上、最適化に必要以上の時間を費やすことを回避します。これを確実にするために機能するこれらの機能の1つは「タイムアウト」です(時間の測定ではありません)。

    オプティマイザは、論理クエリの複雑さ、カーディナリティの見積もり、およびこれまでに見つかった最も安いプランの見積もりコスト(ある場合)に基づいて、「調査予算」を設定します。カーディナリティが高い、より複雑なクエリには、より高い予算が割り当てられます。

    検索フェーズの1つでこの予算を超えると、フェーズは終了します。これは、オプティマイザの設計と通常の操作の一部です。より多くのオプティマイザの努力を必要とするクエリはそれを取得します。しないもの、しないもの。

    「タイムアウト」を「十分な計画が見つかりました」と考えてください。

  • 十分な計画が見つかりました

    これは、空白の理由とまったく同じです。コストが0.909090 ...(1/1.1)未満のプランがこのようにラベル付けされるのは、単に歴史的な癖です。この理由が発生した場合、オプティマイザコード内で何も早期に停止したり、特別に処理されたり、異なるものはありません。

メモリ制限を超えていることを除いて、「早期終了の理由」のいずれも、クエリのチューニングやパフォーマンス分析にとって(もしあれば)多くを意味しません。通常は無視します。

助言

実際のパフォーマンスメトリック(経過時間、CPU /メモリの使用状況など...コンテキストで重要なもの)に基づいて、クエリのチューニング作業をターゲットにします。意図した目的に対してクエリが遅すぎる場合は、時間をかけて高速化します。実際のパフォーマンスを測定し、それをベースラインおよび履歴と比較して、重要な差異での調整作業を対象とします。

保証されたクリーンなデータを、有用な統計とインデックス、および適切に記述されたオプティマイザフレンドリーなクエリを使用して、適切なリレーショナルスキーマに保存します。

21
Paul White 9

http://schemas.Microsoft.com/sqlserver/2004/07/showplan/showplanxml.xsd (これは、実行プランをxmlとして開いた場合に表示されるリンクです) )、以下の3つの理由が表示されます。

  • タイムアウト
  • MemoryLimitExceeded
  • GoodEnoughPlanFound

あなたが言及した記事は、これらのイベントを見つけるのに問題がないようですが、特定の問題がありますか?留意すべき唯一のことは、これらのDMVはサーバーで実行されたすべてのSQLコマンドをキャプチャーせず、サーバーの再起動時にリセットされることです。拡張イベントでshowplan xmlをトラップしてクエリすることもできますが、私にはやりすぎのようです。

私はGoodEnoughPlanFoundについてもあまり心配しません。オプティマイザが(適切なプランをすばやく見つける)仕事をかなりうまく行っているようです。

HTH

10
wBob