私は今データベースインデックスについて学んでいて、それらを使用する効率を理解しようとしています。
sql +を使用しています。
実行プランを確認するにはどうすればよいですか。また、インデックスが使用されたかどうかを示す情報はどこにありますか?
このコードを使用して、最初に説明してから計画を確認してみてください。
計画を説明する:
explain plan
for
select * from table_name where ...;
計画を参照してください:
select * from table(dbms_xplan.display);
編集:角かっこを削除しました
計画の説明 を見てください。 EXPLAINは多くのdbタイプで機能します。
特にsqlPlusについては、sqlplusの AUTO TRACE 機能を参照してください。
SQL> explain plan for 2
select * from hr.employees;
説明した。
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1445457117
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 107 | 7704 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7704 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
8 rows selected.
OR
SQL> set autotrace traceonly explain
SQL> select * from hr.employees;
Execution Plan
----------------------------------------------------------
Plan hash value: 1445457117
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 107 | 7704 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7704 | 3 (0)| 00:00:01 |
これは非常に一般的な質問なので、この回答を 記事 に変換することにしました。
推定実行プランは、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'