</p> Predicate Information (identified by operation id):
0 J' S4 B- R ~; g+ i ---------------------------------------------------
+ @# }$ E' i/ X `- N- G% {- K8 P 2 - access("CREDIT_CARD"=3485458104610650)3 ?' d2 a$ B! c2 b$ o& y
SQL> SELECT * FROM app_001.transactions
# J3 S2 }8 }; s, T D e& @2 w 2 WHERE credit_card BETWEEN 3499990000000000 AND 3499999999999999;
+ N7 ^) e; p8 x; `4 Q5 w' m. i TRANS_ID CREDIT_CARD3 y* ~, h$ i t
---------- -----------------/ d1 I7 _% E( h1 T# L3 Y" g
60420 3499997873591732) S# B; A2 {7 O# s
4629 34999909872779419 ^# h* }# e7 J- h O- I2 m! B
18597 34999932506940895 B8 B: f, \) L9 P- [" U1 l9 @
13364 3499996558049599
6 m' E* E- ?- p& F% e. } 24392 3499998608513414& z0 g& s2 d/ @" _5 r
79326 3499996616476145
1 l) `. C5 V6 h3 l6 P, z: B: L- u 72183 34999999779253920 M+ M, t5 E2 D) q! C% T3 ?6 M' c
97433 3499999831086288
8 C2 Y; Q; M/ D 8 rows selected.
4 N3 ^# R, {# S+ S; G Execution Plan
L- P' h# q/ F! @ ----------------------------------------------------------
( X1 v+ B6 X9 G X; ` Plan hash value: 1321366336
: O( Z" e. Y0 r ----------------------------------------------------------------------------------
' y( @3 m. q% X, ` U/ c | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
/ U. `2 D3 b/ E' h! v' D ----------------------------------------------------------------------------------
/ b6 ~. H3 b L | 0 | SELECT STATEMENT | | 1250 | 17500 | 914 (2)| 00:00:11 | |/ d& ?( L* l/ Q$ \4 f
|* 1 | TABLE ACCESS FULL| TRANSACTIONS | 1250 | 17500 | 914 (2)| 00:00:11 |/ Y9 o$ N9 K1 n; a/ O
----------------------------------------------------------------------------------8 J4 |- Q& u4 h* z
Predicate Information (identified by operation id):
4 X" D* N6 ^; J: Y p# ^5 { ---------------------------------------------------, m9 w# ]5 h- Y5 e p/ c. e6 Z: [! Y
1 - filter(INTERNAL_FUNCTION("CREDIT_CARD")>=3499990000000000 AND
0 N) F0 {6 y, ] ~; ` INTERNAL_FUNCTION("CREDIT_CARD") -- Disable tracing and explain plan output8 z1 R+ h( i. l h: }0 Z
SQL> SET AUTOTRACE OFF;) H- b( j0 n, `+ A8 B
列表 4 细心识别引用加密列数据的 SQL 语句,然后斗劲加密前后这些语句的执行打算,以查找是否存在任何更改。
5 h$ ~7 x& u R; O0 C 我还想知道加密的开销是否会改变打算成本以及优化轨范的选择,即使在文档建议不要这样做的情形下。为了确保我切当知道进行出产时关头使命应用轨范所发生的情形,我在沙箱情形中进行了一些额外的工作。首先,我从各类自动负载信息库 (AWR) 快照中收集了一个使用频仍的 SQL 语句(CPU、Gets 和 I/O)列表。然后,我斗劲了加密列前后每个 SQL 语句的发芽执行打算。我的研究转向对多个基于相等的前提使用一个谓辞书复杂发芽,其一一个前提是以将要进行加密的列为方针。让我受惊的是,在对列进行加密之后,该发芽的执行打算发生了改变。遗憾的是,我无法在我的测试尝试室中为本文复制这些结不美观,我仍然无法完全确定发芽打算发生改变的原因。但我之所以在此处提到这种情形是想指出,在对出产系统进行更改之前,最好在测试情形中研究出产应用轨范密钥发芽的执行打算。如不美观我假设没有任何使用频仍的发芽会发生改变,那么我们将对出产系统进行更改而且不得不勉强拼集一个解决方案。
; m' D) Y% T1 G0 I: Z% a 此处的教训是,在进行更改之前,您应该始终对这些事项进行测试,无论内在文档和其他来历中阅读了什么内容都是如斯。% t1 ]4 h* x7 v" k
结论
; f& P2 Y, h9 u8 D* i8 W* T; {2 L3 Z 使用 Oracle 的 TDE 特征加密新表与没有任何数据的表中的列或者现有表中的新列很是简单,原因是不存在任何需要担忧的相关性。相反,加密现有列数据需要细心研究并在您的沙箱情形中进行测试,然后才能在现实出产系统中实施您的打算,因为加密可能会影响良多相关性。9 ]. i: x. c; y2 C2 E% m3 V
Steve Bobrowski 自 Oracle 数据库版本 5 起头一向使用该软件,曾就职于 Oracle;他仍是 The Database Domain (dbdomain.com) 的创始人以及五本 Oracle 出书社出书的书籍的作者(搜罗《Oracle 数据库 10g 快捷版上机操作》系列)。比来,Steve 担任着际啦型公司(如 Computer Sciences Corporation、BEA Systems 和 Salesforce.com)的 SaaS 参谋和 SaaS 首席手艺官。 |