web-dev-qa-db-ja.com

クエリの説明計画をどのように解釈しますか?

SQLステートメントがどのように実行されているかを理解しようとするときは、説明プランを調べることをお勧めします。説明計画の解釈(意味の理解)で行うべきプロセスは何ですか? 「ああ、これは見事に機能している?」対「ああ、いや、そうではない」。

87
user290

テーブルスキャン全体が不良であり、インデックスアクセスが良好であるというコメントを見るたびに、私は震えます。全表スキャン、インデックス範囲スキャン、高速全インデックススキャン、ネストループ、マージ結合、ハッシュ結合などは、アナリストが理解し、データベース構造とクエリの目的に関する知識と組み合わせなければならない単なるアクセスメカニズムです。有意義な結論に達するために。

フルスキャンは、データセグメント(テーブルまたはテーブル(サブ)パーティション)のブロックの大部分を読み取る最も単純な方法であり、パフォーマンスの問題を示す場合がありますが、それはコンテキスト内のみですクエリの目標を達成するための効率的なメカニズムであるかどうか。データウェアハウスおよびBI担当者と言えば、パフォーマンスに対する私の最大の警告フラグは、インデックスベースのアクセス方法とネストされたループです。

そのため、説明計画の読み方のメカニズムについては、Oracleのドキュメントが適切なガイドです。 http://download.Oracle.com/docs/cd/B28359_01/server.111/b28274/ex_plan.htm# PFGRF009

パフォーマンスチューニングガイドもよく読んでください。

また、「カーディナリティフィードバック」のグーグルも用意します。これは、説明プランを使用して、クエリのさまざまな段階でのカーディナリティの推定値を、実行中に実際に発生したカーディナリティと比較できます。ヴォルフガング・ブライトリングがこのメソッドの作者だと思います。

結論:アクセスメカニズムを理解する。データベースを理解します。クエリの意図を理解する。経験則を避けてください。

78
David Aldridge

この主題は、このような質問に答えるには大きすぎます。読むのに時間がかかるはずです Oracleのパフォーマンスチューニングガイド

13
Tony Andrews

以下の2つの例は、INDEXを使用した完全スキャンと高速スキャンを示しています。

コストと基数に集中するのが最善です。例を見ると、インデックスを使用すると、クエリの実行コストが削減されます。

それはもう少し複雑です(そして、私はそれに100%ハンドルを持っていません)が、基本的にコストはCPUの関数であり、IOコストであり、カーディナリティはOracleの行数ですこれらの両方を減らすことは良いことです。

クエリのコストは、クエリとOracleオプティマイザーモデル(COST、CHOOSEなど)および統計の実行頻度によって影響を受ける可能性があることを忘れないでください。

例1:

SCAN http://docs.google.com/a/shanghainetwork.org/File?id=dd8xj6nh_7fj3cr8dx_b

インデックスを使用した例2:

INDEX http://docs.google.com/a/fukuoka-now.com/File?id=dd8xj6nh_9fhsqvxcp_b

すでに提案したように、TABLE SCANに注意してください。通常はこれらを回避できます。

5
Mark Nold

シーケンシャルスキャンのようなものを探すことはいくらか便利ですが、現実は数字にあります...数字が単なる推定値である場合を除いて!通常はfarクエリを見るよりも便利ですplanは実際のexecution Postgresでは、これがEXPLAINとEXPLAIN ANALYZEの違いです。 EXPLAIN ANALYZEは実際にクエリを実行し、すべてのノードの実際のタイミング情報を取得します。これにより、プランナーが考えるの代わりに、実際に何が起こっているかを確認できます起こります。多くの場合、シーケンシャルスキャンはまったく問題ではなく、クエリ内の別の問題であることがわかります。

もう1つのキーは、実際の高価なステップが何であるかを識別することです。多くのグラフィカルツールは、さまざまなサイズの矢印を使用して、計画のさまざまな部分のコストを示します。その場合は、細い矢印が出て、太い矢印が出るステップを探してください。 GUIを使用していない場合は、数値を確認し、突然大きくなる場所を探す必要があります。少し練習すれば、問題のある領域を見つけるのはかなり簡単になります。

4
decibel

本当にこれらのような問題については、行うべき最善のことは [〜#〜] asktom [〜#〜] です。特に、その質問に対する彼の答えには、オンラインのOracleドキュメントへのリンクが含まれています。ここでは、こうした種類のルールの多くが説明されています。

心に留めておくべきことの1つは、説明計画は本当に最良の推測であるということです。

Sqlplusの使用方法を学び、AUTOTRACEコマンドを試してみることをお勧めします。いくつかのハードナンバーを使用すると、通常、より適切な決定を下すことができます。

ただし、ASKTOMを使用する必要があります。彼はそれについてすべて知っている:)

3
EvilTeach

Explainの出力は、各ステップにかかった時間を示します。最初のことは、長い時間がかかったステップを見つけて、それらの意味を理解することです。順次スキャンのようなものは、より良いインデックスが必要であることを示します-それは主に特定のデータベースと経験の研究の問題です。

2
Tom Leys

1つの「ああ、それは正しくありません」は、多くの場合table scanの形式です。テーブルスキャンは特別なインデックスを使用せず、メモリキャッシュ内のすべての有用なものの削除に貢献できます。たとえば、postgreSQLでは、次のようになります。

Seq Scan on my_table  (cost=0.00..15558.92 rows=620092 width=78)

テーブルスキャンは、インデックスを使用して行を照会する場合などに理想的です。しかし、これはあなたが探していると思われる赤旗パターンの1つです。

2
convex hull

基本的に、各操作を調べて、操作がどのように機能するかについての知識を与えられて、操作が「意味をなす」かどうかを確認します。

たとえば、2つのテーブルAとBをそれぞれの列CとD(AC = BD)に結合しており、プランにテーブルのクラスター化インデックススキャン(SQL Server用語-Oracle用語は不明)が表示されている場合A、次にテーブルBの一連のクラスター化インデックスシークへのネストされたループ結合では、問題が発生したと思われるかもしれません。このシナリオでは、エンジンが(結合された列のインデックスを介して)インデックススキャンのペアを実行し、その後にマージ結合を実行することが予想されます。さらに調査すると、統計情報が不正であることが明らかになり、オプティマイザはその結合パターン、または実際には存在しないインデックスを選択することになります。

2
Jonathan Rupp

計画の各サブセクションに費やされた時間の割合を見て、エンジンが何をしているかを検討してください。たとえば、テーブルをスキャンしている場合は、スキャンしているフィールドにインデックスを付けることを検討してください

1
Steven A. Lowe

主にインデックスまたはテーブルスキャンを探します。これは通常、whereステートメントまたはjoinステートメントにある重要な列のインデックスがないことを示しています。

http://www.sql-server-performance.com/tips/query_execution_plan_analysis_p1.aspx から:

実行計画に次のいずれかが表示されている場合は、警告サインを考慮し、潜在的なパフォーマンスの問題について調査する必要があります。いずれもパフォーマンスの観点からは理想的ではありません。

* Index or table scans: May indicate a need for better or  additional indexes.
* Bookmark Lookups: Consider changing the current clustered index,
  consider using a covering index, limit
  the number of columns in the SELECT
  statement.
* Filter: Remove any functions in the WHERE clause, don't include wiews
  in your Transact-SQL code, may need
  additional indexes.
* Sort: Does the data really need to be sorted? Can an index be used to
  avoid sorting? Can sorting be done at
  the client more efficiently? 

これらを回避できるとは限りませんが、回避できるほど、クエリのパフォーマンスは速くなります。

1
dpollock