web-dev-qa-db-ja.com

データベース内で最新のSQLステートメントを見つける方法は?

データベース内で実行された最新のステートメントを、パフォーマンスインジケーターとともに取得したい。

そのため、どのSQLステートメントが最もCPU/DISKを集中的に使用しているかを知りたいと思います。

25
Sebastian Roth

これが、仕事をするためのSQLです。試用期間中です。

ステップ1:インストールIDとユーザーIDを決定します。

SELECT inst_id,sid FROM gv$session WHERE username='<ENTER-USERNAME>';

ステップ2:

SELECT 
      s.sid
     ,s.CLIENT_INFO
     ,s.MACHINE
     ,s.PROGRAM
     ,s.TYPE
     ,s.logon_time
     ,s.osuser
     ,sq.sorts
     ,sq.DISK_READS
     ,sq.BUFFER_GETS
     ,sq.ROWS_PROCESSED
     ,sq.SQLTYPE
     ,sq.SQL_TEXT
 FROM gv$session s    
    , gv$sql sq
WHERE s.SQL_HASH_VALUE = sq.HASH_VALUE
  AND s.inst_id = :inst_id -- replace with instID from above
  AND s.sid = :sid -- replace with ID from above
  AND sq.inst_id = s.inst_id

複数のIDとインスタンスIDが返される場合があります。したがって、このデータをWebインターフェースなどで使用する方法は、ユーザーの選択次第です。

17
Sebastian Roth

Oracles Enterprise Monitorコンソールは、どのSQLクエリが最大CPU、ボトルネック、データベースのトップアクティビティ、SQLのブロックなどを取得しているかに関する豊富な情報を表示します。

歴史的なアプローチの場合、Oracleの [〜#〜] awr [〜#〜] レポートを使用して、自分に関する特定の領域を特定できます。

alt text

enter image description here

13
Sathyajith Bhat

V$SQLを使用することもできます。いくつかの興味深い列RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXTなどがあります。

これにより、ディスク読み取りごとに上位10のステートメントが表示されます(注-これはすべての実行で累積されます)。

select sql_id,child_number from
(
select sql_id,child_number from v$sql
order by disk_reads desc
)
where rownum<11

ステートメントがまだV$SQL_PLANにある場合は、クエリの実際のEXPLAIN PLANを取得できます。

select * from table(dbms_xplan.display_cursor('sql_id',child_number));

V$SQL_PLANも良い情報が含まれているので、使用することも好きです。 statistics_level=ALLの場合、V$SQL_PLAN_STATISTICSを使用できます。

4
gabrielp

最近のSQLの場合:

select * from v$sql

歴史について:

select * from dba_hist_sqltext
2
grokster