web-dev-qa-db-ja.com

オプティマイザーが特定の説明プランを選択した理由をいくつか説明できますか?

これは説明プランを読むことではありません。

これは、ヒントを追加したり、特定のクエリのパフォーマンスを測定したりすることではありません。

与えられた 計画の説明 クエリ(またはクエリの自動トレース)がオプティマイザを「尋ねる」ことが可能かどうか常に疑問に思っていました(= /// =)なぜこのプランと利用可能な他のプランを選択しました。

  • 同じクエリに対して考慮したさまざまなプランの比較を表示するようにデータベースに要求する方法はありますか?
  • プランに表示されるコストにどのような計算が行われたかを確認する方法はありますか? (たとえば、オプティマイザーが想定したディスクアクセスとメモリ内のものなど)

この質問の理由:私が知っているEXPLAIN PLANを使用して、データベースが特定の実行プランを選択し、これが不十分/遅すぎる/ ...最初の瞬間にDBAまたは開発者が行う場合 notアドホックノウ:このプランに代替案があったかどうか、さらに、開発者が代替案(未使用のインデックスなど)を知っている場合、その代替案が使用されなかった理由がわかりません。

1
Martin

はい、できます。

これは、Oracleオプティマイザのトレースと呼ばれます。そうすることで、プランの作成時に行われたすべての推論をオプティマイザーがダンプするトレースファイルが作成されます。

特定のSQLのトレースを生成する例は、ここにあります 特定のSQLシステム全体のオプティマイザーをトレースする方法-10053トレースイベント

トレースで見つかったデータの量を考えると、それを読むのに少し時間がかかるかもしれません。Oracleがこれを実行して適切な時間で戻る時間を見つけることさえ驚くべきことです。

2
ik_zelf

オラクルのオプティマイザは、それ自体が科学全体です。 @ik_zelfに加えて、.trcファイルを人間が読める形式にするのに役立つTKPROFを確認する必要があります。 Cary Millsap(主にOracleトレース)の本については、 ここ および ここ を確認してください。 Oracleオプティマイザに関する多くの情報については、Jonathan Lewisの book および彼の blog を確認してください。ルイスの本は536ページの長さで(それはファンダメンタルズとだけ呼ばれています!)、彼は別の本を書くつもりだと言いました(まだ登場していません)。 「計画の安定性」(Google it)と呼ばれる概念もあります。この概念では、パフォーマンスに満足していて、オプティマイザーに「二度と推測」させたくない場合に計画を修正して、最適ではない計画を作成することができます。このアイデアは、「知らない悪魔よりも知っている悪魔の方が優れている」という方針に沿っているようです。つまり、 _ might _ よりも合理的に機能する次善の計画の方が優れています。見事に実行されますが、オプティマイザーが機能しなくなると、作業が失敗するリスクがあります。

1
Vérace