web-dev-qa-db-ja.com

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

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

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

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

そして...

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

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

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

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

8
Tommy O'Dell

Explainプランを理解する方法を学ぶことは、SQLステートメントを最適化するのに役立つ重要なスキルだと思います。 Christian Antogniniの本 Troubleshooting Oracle Performance を見つけました。これは、これらがどのように機能するかを詳しく説明し、データベースの最適化への取り組み方を説明するのに非常に役立ちます。数年経ちますが、それでもまだ関連性のある多くのことを学ぶでしょう。

もっと上級者になったら、Jonathan Lewisの本を見ることができますが、これらはより詳細なので、おそらく良い出発点ではありません。 コストベースのOracle Fundamentals は現在かなり古いものですが、その多くはまだ関連しています。まだ読んでいません Oracle Core:トラブルシューティングに不可欠な内部要素 ですが、Oracleコミュニティからは良いレビューを受けています。

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

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

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

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

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

7
Chris Saxon

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

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

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

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

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

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

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

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

1
BillThor