どのように説明計画を取得しますか?


10

誰かが説明計画について少し説明してもらえますか、そしてどのようにしてクエリの説明計画を取得しますか?また、このためのユーティリティとして使用できるSQLスクリプトがあれば、それは素晴らしいことです。


1
「このユーティリティとして使用できるSQLスクリプトがある場合」どのタイプのユーティリティを探していますか?
デレクダウニー

2
多くのSQL開発ツールには、実行計画を取得するための非常に使いやすいGUIがあります。Oracle SQL Developerには1つあります。そのようなツールにアクセスできますか、それともスクリプトからこれを実行しますか?
FrustratedWithFormsDesigner

Oracle SQL Developerは持っていますが、スクリプトについて知りたいです。
user419534

2
Jonathan Lewisのコースを受講している場合、Oracleから実行プランを取得するには8つの異なる方法があることがわかります。さまざまな方法をすべて記載した回答を追加する場合は、このコメントに投票してください。
Colin 't Hart

回答:


9

パッケージDBMS_XPLANを使用できます。

SQL> explain plan for select * from dual;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |     2 |     2 |
|   1 |  TABLE ACCESS FULL   | DUAL        |     1 |     2 |     2 |
--------------------------------------------------------------------
Note: cpu costing is off

5

EXPLAIN PLANステートメントは、オプティマイザがSELECT、UPDATE、INSERT、DELETEステートメントに対して選択した実行プランを表示します。ステートメント実行プランは、データベースがステートメントを実行するために実行する一連の操作です。

EXPLAIN PLAN FOR ...

...をSQLステートメントに置き換えます。これを実行した後、次を実行して計画を表示します。

SELECT * FROM table(dbms_xplan.display);

詳細については、 『Oracle 11g Performance Tuning Guide』の「Overview」または「Usage」のセクションを参照してください。


1

これは非常に一般的な質問なので、この回答を記事に変えることにしまし

推定SQL実行計画

推定実行プランは、SQLクエリを実行せずにオプティマイザーによって生成されます。EXPLAIN PLAN FORを使用して任意のSQLクライアントから推定実行プランを生成するか、このタスクにOracle SQL Developerを使用できます。

説明計画

Oracleを使用しているときEXPLAIN PLAN FORに、指定されたSQLクエリにコマンドを付加すると、データベースは関連付けられたに推定実行プランを格納しますPLAN_TABLE

EXPLAIN PLAN FOR
SELECT p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

推定実行プランを表示するにDBMS_XPLAN.DISPLAYは、次の例に示すように、を使用する必要があります。

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))

ALL + OUTLINEフォーマットオプションを使用すると、デフォルトのフォーマットオプションを使用するよりも、推定実行プランの詳細を取得できます。

Oracle SQL開発者

SQL Developerをインストールしている場合は、EXPLAIN PLAN FORコマンドを付加することなく、SQLクエリの推定実行プランを簡単に取得できます。

ここに画像の説明を入力してください

実際のSQL実行計画

実際のSQL実行プランは、SQLクエリの実行時にオプティマイザーによって生成されます。したがって、推定実行プランとは異なり、実際の実行プランを取得するには、SQLクエリを実行する必要があります。

基礎となるリレーショナルデータベースによってテーブル統計が適切に収集されている限り、実際の計画は推定されたものと大幅に異なるはずはありません。

GATHER_PLAN_STATISTICSクエリヒント

特定のSQLクエリの実際の実行プランを格納するようにOracleに指示するには、GATHER_PLAN_STATISTICSクエリヒントを使用できます。

SELECT /*+ GATHER_PLAN_STATISTICS */
  p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

実際の実行計画を視覚化するには、以下を使用できますDBMS_XPLAN.DISPLAY_CURSOR

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))

DB接続レベルで統計を有効にする

特定のセッション内で生成されたすべてのクエリの実行プランを取得する場合は、STATISTICS_LEVELセッション構成をALLに設定できます。

ALTER SESSION SET STATISTICS_LEVEL='ALL'

これはGATHER_PLAN_STATISTICS、すべての実行クエリにクエリヒントを設定するのと同じ効果があります。したがって、GATHER_PLAN_STATISTICSクエリヒントと同様に、を使用DBMS_XPLAN.DISPLAY_CURSORして実際の実行プランを表示できます。

STATISTICS_LEVEL関心のある実行プランの収集が完了したら、設定をデフォルトモードにリセットする必要があります。これは、特に接続プールを使用しており、データベース接続が再利用される場合は非常に重要です。

ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.