【Oracle】SQL_IDの取得方法

Oracle

はじめに

SQL_IDは調査や性能検証等、様々なシーンで必要になります。

OracleでSQLのSQL IDを確認する以下の2つ(過去のSQL・現在流れているのSQL)の方法を記載します。

OracleでSQLのSQL IDを確認する

過去に実行したSQLのSQL IDを取得するSQL

Oracleで過去に実行したSQLのSQL IDを確認するには以下のSQLを実行します。

sysユーザーにて実行します。

実行したSQL文を指定してSQL IDを取得する

このSQL文のSQL IDが知りたいという場合は以下のSQLで取得します。

以下SQLの★部分へ取得したいSQL IDのSQL文を設定します(部分一致で検索、スペースや大文字小文字も一致するよう設定する必要有)。

SET LINESIZE 115
COLUMN SQL_ID FORMAT A15
COLUMN SQL_TEXT FORMAT A50 WORD_WRAP
COLUMN ADDRESS FORMAT A10
COLUMN HASH_VALUE FORMAT 9999999999
COLUMN CHILD_NUMBER FORMAT 99

SELECT SQL_ID, SQL_TEXT, ADDRESS, HASH_VALUE, CHILD_NUMBER
  FROM V$SQL
 WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%' --★ここへSQL文を設定する
;

「SET LINESIZE。。。」の部分は、TeraTermで実行して丁度良いサイズにしています(お好みでカスタマイズしてください)。

SQL IDの取得結果イメージ

私が個人で運営している販売管理DBのSQL ID取得結果(一部モザイク無しにしていますのでご参考までにご参照ください)

SQL_IDはアルファベットと数字の羅列です。

現在実行されてるSQL文のSQL IDを取得する

SET LINESIZE 32767
SET PAGESIZE 0

SELECT Q.SQL_ID
||','||TO_CHAR(NVL(S.SQL_EXEC_START, S.PREV_EXEC_START),'YYYY-MM-DD hh24:mi:ss') 
||','||S.MODULE
||','||Q.PLAN_HASH_VALUE
||','||S.STATUS
||','||Q.SQL_TEXT
FROM V$SESSION S
   , V$SQLSTATS Q
WHERE
  S.USER# <> 0
  AND Q.SQL_ID(+) = NVL(S.SQL_ID, S.PREV_SQL_ID)
  AND S.USERNAME IS NOT NULL
  AND S.STATUS = 'ACTIVE'
ORDER BY
  CASE STATUS WHEN 'ACTIVE' THEN 1 WHEN 'INACTIVE' THEN 2 ELSE  9 END,
  CASE WHEN Q.EXECUTIONS > 0 THEN Q.CPU_TIME / Q.EXECUTIONS ELSE 0 END DESC
;
--SQL_ID,EXEC_START_DATETIME,MODULE,PLAN_HASH_VALUE,STATUS,SQL_TEXT

「SET LINESIZE。。。」の部分は、Max値に設定してみました。

大量に出力されることもあるのでページサイズは0(ページ無し)にしています(お好みでカスタマイズしてください)。

SQLの最後の1行「–SQL_ID,。。。」(コメントアウトしている部分)も一緒に流すことで取得した実行計画のヘッダーを付けています。

SQL IDの取得結果イメージ

Javaプログラムからテスト用SQLを投げた際の結果

取得項目

取得項目の簡単な説明です(取得内容はV$SESSIONV$SQLSTATSのOracleのサイトを見た方が良いですね)。

  • SQL_ID:現在実行されているSQL文のSQL識別子
  • EXEC_START_DATETIME:SQL_EXEC_START=このセッションにより現在実行中のSQL実行が開始された時刻、PREV_EXEC_START=前回実行されたSQL文のSQL実行開始
  • MODULE:現在実行中のモジュール名
  • PLAN_HASH_VALUE:このカーソルに対するSQLプランの数値表現
  • STATUS:セッションの状態(WHERE句でACTIVEのみ取得するように指定)
  • SQL_TEXT:SQLテキストの最初の1000文字

SQL_IDを使ってできること

OracleのSQL_IDは、特定のSQLステートメントを一意に識別するための一連の文字列です。SQL_IDを使用すると、さまざまなデータベース管理タスクを効果的に実行できます。以下は、OracleのSQL_IDを使用して行うことができる主なタスクです。

  1. SQLの監視とチューニング: SQL_IDを使用して、特定のSQLステートメントの実行パフォーマンスを監視し、問題を特定することができます。SQL_IDを基に、クエリの実行計画や実行統計情報を取得し、パフォーマンスの問題点を特定して最適化できます。
  2. SQLプロファイリング: SQL_IDを使用して、SQLステートメントのプロファイリングを実施できます。プロファイリングは、クエリの実行計画を詳細に分析し、最適化のための提案を生成するプロセスです。
  3. SQLトレース: SQL_IDを使用して、特定のSQLステートメントに対するトレースデータを収集できます。トレースデータを解析することで、クエリの実行に関する詳細な情報を取得し、ボトルネックや性能の問題を特定できます。
  4. キャッシュのクエリ削除: SQL_IDを使用して、共有プール内のSQLクエリキャッシュから特定のクエリを削除できます。これは、クエリの再コンパイルやキャッシュのクリアが必要な場合に有用です。
  5. 実行計画の取得: SQL_IDを使用して、特定のSQLステートメントの実行計画を取得できます。これにより、クエリの最適化や問題の特定に役立ちます。
  6. システム全体のモニタリング: SQL_IDを使用して、システム全体で頻繁に実行されるSQLステートメントを特定し、パフォーマンスの問題を把握できます。これにより、繰り返し実行されるクエリの効率性を向上させるための取り組みを行えます。

SQL_IDはOracleデータベースのパフォーマンスチューニングやトラブルシューティングにおいて非常に重要なツールです。特定のSQLステートメントの問題を特定し、最適化するために使用されます。

コメント

タイトルとURLをコピーしました