Oracleで暗号化に関する検証 その7
<Oracleで暗号化に関する検証 その7>
ペンネーム:ウィーット
検証環境は以下の通りです。
OS : Asianux 3
Oracle : Oracle10gR2
CPU : Athlon 777MHz
メモリ : 512MB
前回に引き続き、今回は詳細にtkprofで整形したSQL_TRACEを見ていきます。
1つのSQL(SELECT、UPDATE、DELETE)が実行されると様々な再帰的コール(RECU
RSIVE CALL)が発行される事があります。この再帰的コールとは、ユーザーが
発行したSQLを実行するために必要となるSQLをOracleが追加発行するものです。
再帰的SQLとも言います。再帰的コールが発生すると、再帰的コールの要因と
なったSQL(ユーザーが発行したSQL)に加えて再帰的SQLの統計が表示されます。
各SQLの最後の「recursive depth」値で再帰的コールか判断します。この値が
「1」以上の場合、再帰的コールとなります。(「0」の場合はユーザーが発行し
たSQLを意味しかつ、「0」とは表示されません。)
例)再帰的コールの統計情報
最終行に「recursive depth」が表示されている(←印)。
===================================================================== select owner#,mkeyid,encalg,intalg,colklc,klclen,nvl(flag,0) from enc$ where obj#=:1 call count cpu elapsed disk query current rows ------- ----- ------ -------- ------- -------- -------- ------- Parse 1 0.02 0.01 0 0 0 0 Execute 1 0.03 0.01 0 0 0 0 Fetch 2 0.00 0.00 2 4 0 1 ------- ----- ------ -------- ------- -------- -------- ------- total 4 0.05 0.03 2 4 0 1 Misses in library cache during parse: 1 Misses in library cache during execute: 1 Optimizer mode: CHOOSE Parsing user id: SYS (recursive depth: 1) <------- =====================================================================
SQL_TRACEを取得すると、その取得範囲で捕捉したSQL文全体の統計情報が以下
のように出力されます。
=====================================================================
非再帰的SQL文の統計情報の合計=
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
再帰的SQL文の統計情報の合計=
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
ユーザーが発行したSQL数
user SQL statements in trace file.
内部的に発行されたSQL数
internal SQL statements in trace file.
SQL_TRACE取得中に実行された総SQL数
SQL statements in session.
=====================================================================
それでは、前回検証時に発行したInsert文のSQL_TRACEを見てみましょう。
暗号化されることで再帰的コールが発行されるのでは??
ありました!SQL_TRACEを比較したところ暗号化の項目があるInsert処理では、
「ENC$」という表に対してアクセスがありました。
===================================================================== select owner#,mkeyid,encalg,intalg,colklc,klclen,nvl(flag,0) from enc$ where obj#=:1 call count cpu elapsed disk query current rows ------- ------ ------ --------- ------ -------- ---------- ------- Parse 1 0.02 0.01 0 0 0 0 Execute 1 0.03 0.01 0 0 0 0 Fetch 2 0.00 0.00 2 4 0 1 ------- ------ ------ --------- ------ -------- ---------- ------- total 4 0.05 0.03 2 4 0 1 Misses in library cache during parse: 1 Misses in library cache during execute: 1 Optimizer mode: CHOOSE Parsing user id: SYS (recursive depth: 1) Rows Row Source Operation ------- --------------------------------------------------- 1 TABLE ACCESS FULL ENC$ (cr=4 pr=2 pw=0 time=839 us) =====================================================================
上記のアクセスを考慮してSQL_TRACEの最後にに表示される全体の統計情報を
みてみましょう。
TDEを使用している全体の統計情報
=====================================================================
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows
------- ----- ------ -------- ------ -------- -------- -------
Parse 3 0.02 0.03 0 0 0 0
Execute 4 0.01 0.03 12 5 12 1
Fetch 0 0.00 0.00 0 0 0 0
------- ----- ------ -------- ------ -------- -------- -------
total 7 0.03 0.07 12 5 12 1
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows
------- ----- ------ -------- ------ -------- -------- -------
Parse 18 0.07 0.05 0 0 0 0
Execute 41 0.16 0.15 0 0 0 0
Fetch 71 0.02 0.02 20 144 0 57
------- ----- ------ -------- ------ -------- -------- -------
total 130 0.25 0.23 20 144 0 57
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
-------------------------------- Waited ---------- ------------
db file sequential read 20 0.00 0.00
4 user SQL statements in session.
41 internal SQL statements in session. <-----ここ!
45 SQL statements in session.
0 statements EXPLAINed in this session.
=====================================================================
TDEを使用していない全体の統計情報
=====================================================================
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows
------- ----- ------ -------- ------ -------- -------- -------
Parse 3 0.01 0.03 0 0 0 0
Execute 4 0.02 0.01 9 5 9 1
Fetch 0 0.00 0.00 0 0 0 0
------- ----- ------ -------- ------ -------- -------- -------
total 7 0.03 0.04 9 5 9 1
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows
------- ----- ------ -------- ------ -------- -------- -------
Parse 15 0.05 0.03 0 0 0 0
Execute 20 0.13 0.11 0 0 0 0
Fetch 34 0.01 0.01 12 66 0 24
------- ----- ------ -------- ------ -------- -------- -------
total 69 0.19 0.16 12 66 0 24
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
-------------------------------- Waited ---------- ------------
db file sequential read 12 0.00 0.00
4 user SQL statements in session.
20 internal SQL statements in session. <-----ここ!
24 SQL statements in session.
0 statements EXPLAINed in this session.
=====================================================================
暗号化の処理において「ENC$」へアクセスが発生し、発行される再帰的コール
のSQL数の違いとなって出てきていると思われます。
(「ここ!」の「internal SQL statements in session.」を参照)
TDEの暗号化有無の表への「Insert」処理を検証した結果、暗号化された表への
再帰的コールの数が増えていることがわかりました。
再帰的コールが多くなり、処理するSQLが多くなったため処理時間がのびていま
す。
寒くてコタツから出れない~