oracle

V$SQLSTATS 共有プールからエージアウトしたSQLを確認する

以前「インスタンス起動してからのSQLを確認する」と記載していましたが、こちら誤りでした。V$SQLやV$SQLAREAで確認できなくなった後も確かに、V$SQLSTATSを見るとまだ情報が残っている事もありますが、決して「インスタンスが起動してからのものがずっと残っているわけではない」ようです。インスタンス起動後全てのSQLが残っているならV$SQLSTATSの件数は常に増える一方であるはずですが、件数が減る場合もあります。詳細はわかりませんが何かのタイミングで見えなく(エージアウトする?)なります。(2022/7/8 追記)

過去に動作したSQLを取得する際、V$SQLやV$SQLAREAを確認しますが、これらの動的パフォーマンスビューはライブラリキャッシュに残っている状況においてのみ確認できるという制限があります。これに対し、今回紹介するV$SQLSTATSではV$SQL等で確認できなくなった後もしばらく確認する事ができるようです。ただしずっと残っているわけでもなく「何かのタイミングで消えていく」ようです。

マニュアルには以下のように記載ありますが、EXECUTIONS,ELAPSED_TIME,CPU_TIMEなどを観察していると、対象のSQLがライブラリキャッシュからエージアウトしたタイミングで0にリセットがかかるようです。少なくともsys.dbms_shared_pool.purge()プロシージャでクリアするとV$SQLがクリアされるのは当然ですが、こちらの「値も0クリア」されました。(これかなり残念です、、)

V$SQLSTATSは、SQLカーソルに関する基本的なパフォーマンス統計情報を示し、SQL文ごとに1行ずつ(つまり、SQL_IDの一意の値ごとに1行ずつ)表示します。V$SQLSTATSの各列の定義は、V$SQLビューおよびV$SQLAREAビューと同じです。ただし、V$SQLSTATSビューは、V$SQLおよびV$SQLAREAに比べて、高速かつスケーラブルで、データ保存の仕組みも優れています(カーソルが共有プールで無効になった後でも、統計情報を表示できます)。V$SQLSTATSは、V$SQLおよびV$SQLAREAに表示される列のサブセットを含みます。

https://docs.oracle.com/cd/E57425_01/121/REFRN/GUID-495DD17D-6741-433F-871D-C965EB221DA9.htm
select s.SQL_ID
,s.SQL_TEXT
--,s.SQL_FULLTEXT
,s.PLAN_HASH_VALUE  -- 現在のSQLプランの数値表現
,s.EXECUTIONS,s.CPU_TIME,s.ELAPSED_TIME
,s.APPLICATION_WAIT_TIME
,s.USER_IO_WAIT_TIME
,s.CLUSTER_WAIT_TIME
,s.SORTS
 from v$sqlstats s
;

スポンサーリンク