誰かが説明計画について少し説明してもらえますか、そしてどのようにしてクエリの説明計画を取得しますか?また、このためのユーティリティとして使用できるSQLスクリプトがあれば、それは素晴らしいことです。
パッケージ 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
EXPLAIN PLANステートメントは、オプティマイザがSELECT、UPDATE、INSERT、DELETEステートメントに対して選択した実行プランを表示します。ステートメント実行プランは、データベースがステートメントを実行するために実行する一連の操作です。
EXPLAIN PLAN FOR ...
...をSQLステートメントに置き換えます。これを実行した後、次を実行して計画を表示します。
SELECT * FROM table(dbms_xplan.display);
詳細については、Oracle 11g Performance Tuning Guideの Overview または sage セクションを参照してください。
これは非常に一般的な質問なので、この答えを 記事 に変えることにしました。
推定実行プランは、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フォーマットオプションを使用すると、デフォルトのフォーマットオプションを使用するよりも、推定実行プランの詳細を取得できます。
SQL Developerをインストールしている場合は、EXPLAIN PLAN FORコマンドを付加することなく、SQLクエリの推定実行プランを簡単に取得できます。
実際のSQL実行プランは、SQLクエリの実行時にオプティマイザーによって生成されます。したがって、推定実行プランとは異なり、実際の実行プランを取得するには、SQLクエリを実行する必要があります。
基礎となるリレーショナルデータベースによってテーブル統計が適切に収集されている限り、実際の計画は推定されたものと大幅に異なるはずです。
特定の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'))
特定のセッション内で生成されたすべてのクエリの実行プランを取得する場合は、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'