Oracleで暗号化に関する検証 その7

投稿日: 2006年1月25日

<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が多くなったため処理時間がのびていま
す。

寒くてコタツから出れない~