web-dev-qa-db-ja.com

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

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

10
user419534

パッケージ 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
9
Vincent Malgrat

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

EXPLAIN PLAN FOR ...

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

SELECT * FROM table(dbms_xplan.display);

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

5
Leigh Riffel

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

推定SQL実行計画

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

説明計画

Oracleを使用している場合、特定のSQLクエリにEXPLAIN PLAN FORコマンドを付加すると、データベースは推定実行プランを関連する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クエリの推定実行プランを簡単に取得できます。

enter image description here

実際の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'
1
Vlad Mihalcea