誰かが説明計画について少し説明してもらえますか、そしてどのようにしてクエリの説明計画を取得しますか?また、このためのユーティリティとして使用できるSQLスクリプトがあれば、それは素晴らしいことです。
誰かが説明計画について少し説明してもらえますか、そしてどのようにしてクエリの説明計画を取得しますか?また、このためのユーティリティとして使用できる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」または「Usage」のセクションを参照してください。
推定実行プランは、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フォーマットオプションを使用すると、デフォルトのフォーマットオプションを使用するよりも、推定実行プランの詳細を取得できます。
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'