メモリ制限を超えました
オプティマイザーは、メモリーの負荷のために、より良いプランの代替案の検索を停止せざるを得ませんでした。その理由を調査して修正し、クエリのコンパイルを再試行する必要があります。返されるプランは、メモリ不足状態が存在しなかった場合にオプティマイザーが選択したプランではない可能性があります。
タイムアウト
この理由は非常に誤解されています。
クエリオプティマイザーは、合理的な計画をすばやく見つけることを目的としています。最適なプランを見つけるための徹底的な検索は実行されません。設計上、必要以上に最適化に時間を費やすことを避けます。これを保証するために機能するこれらの機能の1つは、「タイムアウト」です(時間の尺度ではありません)。
オプティマイザーは、論理クエリの複雑さ、カーディナリティー推定、およびこれまでに見つかった最も安価なプランの推定コスト(ある場合)に基づいて、「探索予算」を設定します。より高いカーディナリティを持つより複雑なクエリには、より高い予算が与えられます。
検索フェーズのいずれかでこの予算を超過した場合、フェーズは終了します。これは、設計の一部であり、オプティマイザーの通常の動作です。より多くのオプティマイザーの努力を必要とするクエリはそれを取得します。しないもの、しないもの。
「タイムアウト」を「十分な計画が見つかりました」と考えてください。
十分な計画が見つかりました
これは、空白の理由とまったく同じことを意味します。0.909090 ...(1 / 1.1)未満のコストで計画がこのようにラベル付けされているのは、単に歴史的な癖です。この理由が現れた場合、オプティマイザーコード内で何も早期に停止したり、特別に処理されたり、異なることはありません。
メモリ制限の超過を除いて、「早期終了の理由」はどれも、クエリのチューニングまたはパフォーマンス分析にとって(もしあれば)意味がありません。私は通常それらを無視します。
助言
実際のパフォーマンスメトリック(経過時間、CPU /メモリ使用量、...コンテキストで重要なもの)に基づいて、クエリチューニング作業を対象にします。クエリが意図した目的に対して遅すぎる場合は、時間をかけて高速化します。実際のパフォーマンスを測定し、ベースラインおよび履歴と比較し、重要な差異でチューニング作業をターゲットにします。
有用な統計とインデックス、および適切に記述されたオプティマイザフレンドリーなクエリを使用して、クリーンな保証付きデータを適切なリレーショナルスキーマに格納します。