web-dev-qa-db-ja.com

OracleでSQL実行プランを確認するにはどうすればよいですか?

私は今データベースインデックスについて学んでいて、それらを使用する効率を理解しようとしています。

  • 特定のクエリがインデックスを使用しているかどうかを確認したいのですが。
  • インデックスを使用してクエリを実行する場合と、インデックスを使用せずにクエリを実行する場合の違いを実際に確認したい(したがって、クエリの実行プランを確認したい)。

sql +を使用しています。

実行プランを確認するにはどうすればよいですか。また、インデックスが使用されたかどうかを示す情報はどこにありますか?

15
user1573640

このコードを使用して、最初に説明してから計画を確認してみてください。

計画を説明する:

explain plan 
for 
select * from table_name where ...;

計画を参照してください:

select * from table(dbms_xplan.display);

編集:角かっこを削除しました

24
Birupakhya Dash

計画の説明 を見てください。 EXPLAINは多くのdbタイプで機能します。

特にsqlPlusについては、sqlplusの AUTO TRACE 機能を参照してください。

3
Glenn

これを試して:

http://www.dba-Oracle.com/t_explain_plan.htm

実行プランには、使用されるたびにインデックスが記載されます。実行計画を読んでください。

2
Amaethon
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 |

https://wordpress.com/post/cevikfaruk.wordpress.com/277

1
Faruk ÇEVİK

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

推定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 Developer

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'))

すべてのクエリでSTATISTICSを有効にする

特定のセッション内で生成されたすべてのクエリの実行プランを取得する場合は、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'
0
Vlad Mihalcea