SQLクエリの最適化と実行プランの理解-リソース?


8

仕事でますます多くのSQLクエリ(主にOracle 11g、一部のSQL Server 2005-2008)を書いていることに気付き、残りのアナリストチームのためにかなり複雑なビューの作成を開始しました。

それらはほとんどすべて非常にうまく動作しますが、いくつかはそれほどうまくいきません。そう...

  • クエリを調整する方法を教えてください。
  • 実行計画を読んで行動することを学ぶ必要がありますか?

そして...

  • SQLクエリのチューニングについて1)一般に2)特にOracle 11gについて学習するためにどの本/ウェブサイトをお勧めできますか?

ここには優れたDBAが何人かいますが、彼らは多すぎて、作成するすべてのクエリを調整するのに役立ちません。

私がAmazonでOracleで見つけたほとんどの本は、全体的なデータベースの最適化を対象としたものであるか、8〜10年前に書かれたものです。

アドバイスありがとうございます:)


回答:


7

Explainプランを理解する方法を学ぶことは、SQLステートメントを最適化するのに役立つ重要なスキルだと思います。Christian Antogniniの書籍「トラブルシューティングOracleパフォーマンス」は、これらがどのように機能するかを詳しく説明し、データベースの最適化への取り組み方を説明するのに非常に役立ちました。数年前のことですが、それでも関連性のある多くのことを学ぶことができます。

もっと上級者になったら、Jonathan Lewisの本を見ることができますが、これらはより詳細なので、おそらく良い出発点ではありません。コストベースのOracle Fundamentalsはかなり古いものですが、その多くはまだ関連しています。「Oracle Core:Essential Internals for Troubleshooting」はまだ読んでいませんが、Oracleコミュニティからは良いレビューを受けています。

11gを使用しているので、数秒以上かかるクエリがある場合は、リアルタイムSQLモニターを確認することをお勧めします(適切なライセンスが付与されている場合)。名前が示すように、SQLステートメントの進行状況をリアルタイムで表示し、各操作にかかった時間を、これまでにフェッチされた行の詳細とともに分析します。また、最近実行されたクエリの詳細をしばらく保持するため、変更がステートメントにどのように影響するかを確認できます。

Oracle SQL Monitoringのドキュメント:http : //docs.oracle.com/cd/E11882_01/server.112/e16638/instance_tune.htm#PFGRF94543

クエリの調整方法を学ぶことは、時間と練習を要するものです。私が学んだいくつかのこと:

  • できるだけ少ない行をできるだけ早くフェッチするようにクエリを記述します(たとえば、1千万行のテーブルから100行しか必要ない場合、1000万行のテーブルをフルスキャンしたくない)。
  • Explain(予想)計画の各ステップで予想される行数が、実際の実行計画で返される行数と一致することを確認します。これらが桁違いである場合、オプティマイザが「最良の」計画を選択していない可能性があります。
  • 優れたインデックス作成の原則を理解する:クエリの実行時にそれらがどのように機能し、いつ使用すべきか、または使用すべきでないか(Richard Footeは、Oracleのインデックスについて説明している非常に詳細なブログを持っています)

ほとんどの場合、クエリを記述し、(予想される)Explainプランを調べ、これらを実際の実行プランと(クエリのトレースまたはSQLモニターを使用して)比較することで学習します。次に、クエリを書き直し、インデックスを追加/削除し、プランや実行時間にどのように影響するかを確認します


1

Oracle固有の情報を探しているので、OracleのAsk Tomブログをお勧めします。一般的に、アドバイスはクエリを調整しないことだと思います。オプティマイザが最適化できるクエリを作成する方法についての良いアドバイスが得られます。Oracleのドキュメントはオンラインですれており、通常、Oracleの最新情報を探しています。SQLServerを使用したことがないため、推奨事項はありません。

ここ数年、クエリの最適化の分野で新しいことはあまりありません。大きな変更点は、ルールベースのオプティマイザーの廃止です。ただし、SQLServerは依然としてルールベースのオプティマイザを使用しているので、そのルールを理解することが役立つことを理解しています。

クエリを編集して実行し、Explain Planを生成できるツールは、どのような変更によってクエリが適切に実行されるかを理解するのに役立ちます。私はAquaData Studioで良い結果を得ており、ツリービューが本当に気に入っています。SQL開発者も行う必要があります。

他の最適化と同様に、そのパフォーマンスに関する定量的なデータが必要です。次に、実際に最適化したかどうかを判断できます。

クエリを最適化する方法は、パーサーがクエリを構築して最適化する方法に一部依存します。これは、クエリするデータの分布に大きく依存します。Oracleデータベースでは、結果セットがテーブルの4%以上を構成し、ランダムに分散されている場合、通常、テーブルスキャンはインデックスより高速です。

私は開発者のチームのためにクエリを最適化するために取り組んできました。深刻な最適化が必要なのは、1年に2〜3回のクエリだけでした。ほとんどのクエリは、最適化を必要としないほど単純です。残りは通常、不足している結合パスを追加することで処理できます。

Oracleの場合、パフォーマンスに大きな影響を与える可能性のある3つの調整可能な設定があります。インデックスとデータルックアップのコストは相互作用して、インインデックスが使用される条件と使用されない条件を変更します。これら2つは、セッションごとに調整できます。多くの場合、デフォルトは最適ではありません。他の値は、オプティマイザが試行する代替の数を制御します。多くの場合、この値を増やすと役立ちます。

最適化は、データの分散と量に大きく影響されます。最適化する場合は、本番データベースのコピー、または少なくとも同じデータ分布とボリュームを持つデータベースを使用するのが最適です。テスト環境を大幅に破壊し、製造注文データベースのクエリを最適化しました。テストデータベースと開発データベースには、大幅に異なるデータ分布があり、データが大幅に少なくてもクエリが失敗しました。


ここにもっと物質を入れることを検討したいかもしれません。現在のところ、これは実際には「答えではない」境界線です。
JNK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.