Contenu connexe Similaire à V$SQLとその周辺でER図を描いてみよう! (20) V$SQLとその周辺でER図を描いてみよう!2. 2
Bind Peek をもっと使おうぜ!
-JPOUG Advent Calendar 2014-
http://d.hatena.ne.jp/gonsuke777/20
141205/1417710300
まだ統計固定で消耗してるの?
-JPOUG Advent Calendar 2015-
http://d.hatena.ne.jp/gonsuke777/20
151208/1449587953
SQLチューニングと対戦格闘ゲーム
の類似性について語る
- JPOUG Advent Calendar 2016-
http://d.hatena.ne.jp/gonsuke777/
20161215/1481795088
JPOUG Tech Talk Night #6「固定
化か?最新化か?オプティマイザ統
計の運用をもう一度考える。」
http://d.hatena.ne.jp/gonsuke777/20
160226/1456488499
自己紹介代わりの
過去コンテンツ
DDD 2013 SQLチューニングに
必要な考え方と最新テクニック
http://www.oracle.com/technetwo
rk/jp/ondemand/ddd-2013-
2051348-ja.html
コレ
ブログ「ねら~ITエンジニア雑記」
http://d.hatena.ne.jp/gonsuke777/
• DDD 2016 SQL性能を最大限に引き出す
DB 12cクエリー・オプティマイザ 新機
能活用と統計情報運用の戦略
• http://www.oracle.com/technetwork/jp/on
demand/ddd-2016-3373953-ja.html
コレ
13. 13
V$SQL
SQLと実行計画における情報保持の”中核”を成す動的ビュー
– SQL_ID と CHILD_NUMBER で一意になる。
– V$SQLの1レコードが、俗に言う「子カーソル」と対応
– PLAN_HASH_VALUE, SQL_TEXT や BUFFER_GETS, ELAPSED_TIME など
SQL廻りの実行計画関連/統計値関連の情報を保持する。
sql_id child_number sql_text plan_hash_value …
97ykpd1t3b66x 0 WITH WVIEW_JYU1 AS ( … 3426259815 …
97ykpd1t3b66x 1 WITH WVIEW_JYU1 AS ( … 3426259815 …
97ykpd1t3b66x 2 WITH WVIEW_JYU1 AS ( … 3281144771 …
97ykpd1t3b66x 3 WITH WVIEW_JYU1 AS ( … 3281144771 …
0ra4n68mxm4bm 0 SELECT SMGOCHGURIINFO… 1646154537 …
0ra4n68mxm4bm 1 SELECT SMGOCHGURIINFO… 1646154537 …
… … … … …
V$SQL_PLAN
V$SQLTEXT
V$SQLのサンプル
関連表
14. 14
V$SQLのマニュアル記述
Oracle Databaseリファレンス 12cリリース2 V$SQL
https://docs.oracle.com/cd/E82638_01/REFRN/V-SQL.htm#GUID-2B9340D7-4AA8-4894-94C0-
D5990F67BE75
– V$SQLは、GROUP BY句のない共有SQL領域についての統計情報を
示し、入力された元のSQLテキストの子ごとに1行ずつ表示します。
– V$SQLに表示される統計情報は、通常、問合せの実行が終了した
時点で更新されます。ただし、問合せの実行が長期にわたる場合は、
5秒ごとに更新されます。これによって、実行中に、長時間実行される
SQL文の影響を容易に確認できます。
17. 17
V$SQLAREA
V$SQLとほぼ同一構造だが、親としてのサマリ情報を保持する。
– SQL_ID で一意になる。
– EXECUTIONS, BUFFER_GETS, ELAPSED_TIME などはV$SQLの合計となる。
– V$SQLの「子カーソル」と対を成す「親カーソル」がV$SQLAREA
V$SQLAREAから見ると、V$SQLのレコード数は1レコード以上
V$SQLから見ると、V$SQLAREAのレコード数は1レコード
sql_id sql_text plan_hash_value EXECUTIONS …
97ykpd1t3b66x WITH WVIEW_JYU1 AS ( … 3426259815 10 …
0ra4n68mxm4bm SELECT SMGOCHGURIINFO… 1646154537 989 …
… … … …
V$SQLAREA
18. 18
V$SQLAREAのマニュアル記述
Oracle Databaseリファレンス 12cリリース2 V$SQLAREA
https://docs.oracle.com/cd/E82638_01/REFRN/V-SQLAREA.htm#GUID-09D5169F-EE9E-4297-
8E01-8D191D87BDF7
– V$SQLAREAは、共有SQL領域の統計情報を示し、SQL文字列ごとに1行ず
つ表示します。メモリー内にあり、解析済で、実行準備のできているSQL文
に関する統計情報を提供します。
21. 21
V$SQLTEXT
SQLテキストを一定の長さ毎のSQL_TEXT列に保持
– SQL_ID, PIECE で一意になる。
– 複数PIECEから成るレコードのSQL_TEXTを繋ぎ合わせると全体のSQL文になる
V$SQLAREAから見ると、V$SQLTEXTのレコード数は1レコード以上
V$SQLTEXTから見ると、V$SQLAREAのレコード数は1レコード
sql_id piece sql_text …
g9gnrhjwajfnn 0 SELECT /*+ MONITOR */ … …
g9gnrhjwajfnn 1 L_B B WHERE A.P_NO2 = B.P_NO … …
g9gnrhjwajfnn 2 TO_CHAR(B.P_DATE, 'YYYYMMDD’) …
… … …
V$SQLTEXT
25. 25
V$SQL_PLAN
V$SQL(子カーソル)の実行計画をステップ(ID)ごとに保持
– SQL_ID, CHILD_NUMBER, ID で一意になる。
– V$SQLの子カーソル(1レコード)毎に、複数ID(複数ステップ)の情報を保持
– 各ステップ(ID)には実行計画のoperationやobject_name等を保持
V$SQLから見ると、V$SQL_PLANのレコード数は1レコード以上
V$SQ_PLANから見ると、V$SQLのレコード数は1レコード
V$SQL_PLANのサンプル
sql_id child_number id operation object_name depth …
g9gnrhjwajfnn 0 0 SELECT STATEMENT 0
g9gnrhjwajfnn 0 1 HASH JOIN 1
g9gnrhjwajfnn 0 2 TABLE ACCESS TEST_TABLE_A 2
g9gnrhjwajfnn 0 3 TABLE ACCESS TBL_B 2
: : : : : :
28. 28
V$SQL_PLANを整形して出力するのがDBMS_XPLAN
DBMS_XPLAN.DISPLAY_CURSORの実行例
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(sql_id => 'g9gnrhjwajfnn'));
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------
SQL_ID g9gnrhjwajfnn, child number 0
-------------------------------------
SELECT /*+ MONITOR */ A.* FROM TEST_TABLE_A A , TBL_B B
:
Plan hash value: 1335612663
:
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 27 (100)| |
|* 1 | HASH JOIN | | 81 | 2349 | 27 (4)| 00:00:01 |
| 2 | TABLE ACCESS FULL| TEST_TABLE_A | 26 | 416 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| TBL_B | 300 | 3900 | 24 (5)| 00:00:01 |
-----------------------------------------------------------------------------------
:
V$SQL_PLANの各列に対応
30. 30
V$SQL_PLAN_STATISTICS
V$SQL_PLANにおけるステップ(ID)ごとの”実行統計”を保持
– SQL_ID, CHILD_NUMBER, OPERATION_ID で一意になる。
– 各ステップ毎におけるelapsed_time, last_elapsed_time等の実行統計を保持
V$SQL_PLAN_STATISTICS は V$SQL_PLANの属性に相当する
情報(※但し必須ではない)のため、レコードの対応は1: (0 or 1)になる。
V$SQL_PLAN_STATISTICSのサンプル
sql_id child_number operation_id last_elapsed_time elapsed_time …
g9gnrhjwajfnn 0 1 1161324 3357997
g9gnrhjwajfnn 0 2 97137 276762
g9gnrhjwajfnn 0 3 7381 22592
: : : : :
33. 33
SQLの実行統計が採取される条件(制限事項)
10gR1以降の機能となります。
下記の「どちらか」を満たして SQL を実行する必要があります。
– 初期化パラメータ「STATISTICS_LEVEL = ALL」を設定
※セッション単位(ALTER SESSION~)でも設定可能
– SQL に /*+ gather_plan_statistics */ヒントを付与
対象SQLが終了すると、実行統計が共有プールに反映されます。
– SQLが完全に終了するか、Ctrl+C等で強制終了させる必要があります。
– 強制終了させた場合は、強制終了時点までの実行統計が反映されます。
SQL終了前に実行計画を出力しても、実行統計は出てきません。
34. 34
DBMS_XPLAN.DISPLAY_CURSORによる出力例
実行統計出力例(※ALLSTATSがカギ、一部の出力行/出力項目を省略)
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('80w7gaz4dywud', NULL, 'ALL ALLSTATS LAST'));
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------
SQL_ID 80w7gaz4dywud, child number 0
-------------------------------------
SELECT /*+ gather_plan_statistics */ C.DATBI, C.HI_PR, C.LOW_PR,
:
Plan hash value: 3232858554
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name |…| E-Rows |E-Bytes|…| E-Time | A-Rows | A-Time |…|
------------------------------------------------------------------------------------------------------------------ --
| 0 | SELECT STATEMENT | |…| | |…| | 5924 |00:00:53.45 |…|
| 1 | SORT ORDER BY | |…| 414 | 28566 |…| 00:02:43 | 5924 |00:00:53.45 |…|
| 2 | VIEW | |…| 414 | 28566 |…| 00:02:43 | 5924 |00:00:53.43 |…|
| 3 | SORT UNIQUE | |…| 414 | 47610 |…| 00:02:43 | 5924 |00:00:53.42 |…|
| 4 | WINDOW SORT | |…| 414 | 47610 |…| 00:02:43 | 53460 |00:00:53.33 |…|
|* 5 | HASH JOIN | |…| 2722 | 305K|…| 00:02:43 | 53460 |00:00:52.69 |…|
| 6 | TABLE ACCESS BY INDEX ROWID| DBN_FTBPR900 |…| 3640 | 145K|…| 00:02:43 | 54338 |00:00:52.49 |…|
|* 7 | INDEX SKIP SCAN | DBN_FTBPR900PK |…| 2 | |…| 00:02:43 | 54338 |00:00:51.98 |…|
|* 8 | TABLE ACCESS FULL | DBN_FTBAT045 |…| 11477 | 829K|…| 00:00:01 | 22310 |00:00:00.01 |…|
----------------------------------------------------------------------------------------------------------------------
:
実行統計
ここが遅そう…
37. 37
V$SQL_BIND_CAPTURE
V$SQL(子カーソル)毎のバインド変数関連の情報を保持
– SQL_ID, CHILD_NUMBER, POSITION で一意になる。
– V$SQLの1レコード毎に、複数バインド変数の情報を保持
– 変数名やデータ型、データ最大長等の情報を格納する。
全てのSQLでバインド変数が使われている訳ではなく、
バインド変数が複数使われる場合も有るので、V$SQLから見た
V$SQL_BIND_CAPTUREのレコード数は0~複数 となる。
V$SQL_BIND_CAPTUREのサンプル
sql_id child_number position name datatype_string max_length value_string …
7fwycf57590uk 0 1 :B1 VARCHAR2(128) 128 20120801
7fwycf57590uk 0 2 :B2 VARCHAR2(128) 128 20120802
: : : : : :
38. 38
V$SQL_BIND_CAPTUREのマニュアル記述
Oracle Databaseリファレンス 12cリリース2 V$SQL_BIND_CAPTURE
https://docs.oracle.com/cd/E82638_01/REFRN/V-SQL_BIND_CAPTURE.htm#GUID-D353F4BE-5943-
4F5B-A99B-BC9505E9579C
– V$SQL_BIND_CAPTUREは、SQLカーソルによって使用されたバインド変数に関する情報を示しま
す。ビュー内の各行には、カーソルで定義されたバインド変数1個に関する情報が格納されています。
次のものが含まれる。
そのバインド変数を定義するカーソルへの参照
(hash_value, address)は親カーソル用および(hash_value, child_address)は子カーソル用
バインド・メタデータ
バインド変数の名前、位置、データ型、キャラクタ・セットID、精度、スケールおよび最大長。
バインド・データ
バインド変数に対応付けられたSQL文の以前の実行中に、バインド変数に対して使用されたバインド値の1つ。このビュー
では、バインド変数が取得されない場合があります。バインド変数の型が単純な場合(LONG、LOBおよびADTデータ型は
除外)またはバインド変数がSQL文のWHERE句またはHAVING句で使用されている場合にのみ、このビューでバインド値
が表示されます。
– STATISTICS_LEVEL初期化パラメータがBASICに設定されている場合、バインド取得は実行できま
せん。このビューは、(HASH_VALUE, ADDRESS)のV$SQLAREAおよび(HASH_VALUE,
CHILD_ADDRESS)のV$SQLと結合できます。
41. 41
V$SQLSTATS
V$SQLAREAとほぼ同一構造だが、「高速かつスケーラブルで、
データ保存の仕組みも優れている。 (by マニュアル) 」
– V$SQLAREA同様に SQL_ID で一意になる。
– EXECUTIONS, BUFFER_GETS, ELAPSED_TIME などの列も同一
– 最終AWRスナップ後のDELTA値を保持するDELTA_***列が有るのが最大の違い
マニュアルには「カーソルが共有プールで無効になった後でも、
統計情報を表示できます。」と書いてある。
– どう解釈するかだが「カーソル無効化 =レコード無し」と捉えると、
V$SQLAREAにレコードが無くてもV$SQLSTATSにはレコード有と判断できる。
sql_id executions elapsed_time delta_execution
_count
delta_elapsed_ti
me
…
97ykpd1t3b66x 4 1175441 1 10236 …
0ra4n68mxm4bm 989 23198012 0 0 …
… …
V$SQLSTATS
42. 42
V$SQLSTATSのマニュアル記述
Oracle Databaseリファレンス 12cリリース2 V$SQLSTATS
https://docs.oracle.com/cd/E82638_01/REFRN/V-SQLSTATS.htm#GUID-495DD17D-6741-433F-
871D-C965EB221DA9
– 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に表示される列のサブセット
を含みます。
45. 45
V$SQLSTATS_PLAN_HASH
V$SQLSTATSと同一構造だが、SQL_ID と PLAN_HASH_VALUE毎の
サマリー情報を保持する。
– SQL_ID と PLAN_HASH_VALUE で一意になる。
– 列は通常の列、DELTA_***列含めてV$SQLSTATSと同一
V$SQLは同一PLAN_HASH_VALUEでも異なるレコードになるケースが有る
ため、V$SQLSTATS_PLAN_HASHから見たV$SQLのレコード数は複数
– 「カーソル無効化 =レコード無し」と捉えると、V$SQLAREA ⇔ V$SQLSTATS
と同様にV$SQL側のレコードが無いケースも有り得る。
sql_id plan_hash_v
alue
executions elapsed_time delta_executio
n_count
delta_elapsed_
time
…
7fwycf57590uk 1694919098 2 25158 1 14995 …
7fwycf57590uk 1458270739 3 1165278 0 0 …
… …
V$SQLSTATS_PLAN_HASHのサンプル
46. 46
V$SQLSTATS_PLAN_HASHのマニュアル記述
Oracle Databaseリファレンス 12cリリース2 V$SQLSTATS_PLAN_HASH
https://docs.oracle.com/cd/E82638_01/REFRN/V-SQLSTATS_PLAN_HASH.htm#GUID-
B94CE96E-59D1-45AB-B845-B80F76397A9C
– V$SQLSTATS_PLAN_HASHは、SQLカーソルに関する基本的なパフォーマンス統計
情報を示し、SQL文の実行計画ごとに1行ずつ(つまり、SQL_IDと
PLAN_HASH_VALUEの一意の組合せごとに1行ずつ)表示します。
– V$SQLSTATS_PLAN_HASHの列は、V$SQLSTATSの列と同じです。
49. 49
V$SQL_SHARED_CURSOR
V$SQLのレコード(子カーソル)が増える(共有されない)理由を保持
– SQL_ID と CHILD_NUMBER で一意になる。
– V$SQLのレコードと1対1になるため、同ビューの属性ビューとして定義できる。
– Translation_mismatch や use_feedback_stats等の、
カーソルが共有されない理由を保持しています。
sql_id child_number translation_misma
tch
load_optimizer_sta
ts
use_feedback_stat
s
…
7fwycf57590uk 0 N Y N …
7fwycf57590uk 1 N N N …
g9gnrhjwajfnn 0 N N Y …
g9gnrhjwajfnn 1 Y N Y …
g9gnrhjwajfnn 2 Y N Y …
g9gnrhjwajfnn 3 Y N N …
… …
V$SQL_SHARED_CURSORのサンプル
50. 50
V$SQL_SHARED_CURSORのマニュアル記述
Oracle Databaseリファレンス 12cリリース2 V$SQL_SHARED_CURSOR
https://docs.oracle.com/cd/E82638_01/REFRN/V-SQL_SHARED_CURSOR.htm#GUID-
4993A6DE-5658-4745-B43E-F5AD9DB8DCCC
V$SQL_SHARED_CURSORは、特定の子カーソルが既存の子カーソル
と共有されない理由を示します。それぞれの列は、カーソルが共有され
ない具体的な理由を示します。