Performance DBMS_加密性能问题

Performance DBMS_加密性能问题,performance,encryption,indexing,oracle10g,Performance,Encryption,Indexing,Oracle10g,我正在使用DBMS_CRYPTO在数据库被破坏的情况下保护信息。密钥不存储在dbms中,而是由应用程序在每次访问时提供 一个select decrypt(name),seq order by seq查询所需的时间(几乎完全)是两个查询的15倍 select decrypt(name), seq 或 这让我相信解密函数正在破坏主键上的索引seq。为什么会破裂 我尝试将关键字DETERMINISTIC添加到函数的输出类型中,但它只将时间缩短到比更快的查询长10倍左右。我不明白为什么它需要比选择解密

我正在使用DBMS_CRYPTO在数据库被破坏的情况下保护信息。密钥不存储在dbms中,而是由应用程序在每次访问时提供

一个
select decrypt(name),seq order by seq
查询所需的时间(几乎完全)是两个查询的15倍

select decrypt(name), seq

这让我相信解密函数正在破坏主键上的索引
seq
。为什么会破裂

我尝试将关键字
DETERMINISTIC
添加到函数的输出类型中,但它只将时间缩短到比更快的查询长10倍左右。我不明白为什么它需要比选择解密(名称),seq更长的时间编辑:与预期一样,
决定性
关键字也加快了简单解密查询的速度

我的期望是错的,还是别的什么?考虑到安全限制,我可以接受300毫秒的延迟,但是3000毫秒是显而易见的,我想让它更快

我使用的是一个名为SmartSQL的数据库工具,它会显示“经过的时间”(我假设从发送查询到接收结果的最后一位之间的时间)

seq
上有一个索引,即主键。我认为在加密值上放置索引不会有帮助

执行计划:

选择decrypt(名称),seq 按顺序描述选择名称、顺序顺序 选择decrypt(名称),按顺序描述顺序 我的完整查询如下所示:

select 
    seq, gender, wdate, address, 
    my_crypto_pkg.decrypt(tel, 'my_secret_key'), 
    my_crypto_pkg.decrypt(name, 'my_secret_key') 
from cstn_memb_info
--  where my_crypto_pkg.decrypt(name, 'my_secret_key') like ?
order by
    seq desc

只要涉及解密数据的谓词被注释掉,三个查询返回第一行的时间就会非常不同。但考虑到你想要达到的最终结果,这似乎没有什么意义

如果取消了
decrypt
调用,则只需扫描表,就不必调用单独的函数来解密数据(这比读取数据要昂贵得多)。如果按删除
顺序,Oracle只需在返回数据之前解密前N行,甚至不必完成表扫描。如果对数据进行解密并对结果进行排序,则必须先对所有数据进行解密,然后才能进行排序并开始返回结果。对于同时执行
解密
排序的查询,获取最后一行的时间也将最长,但差别将小得多。在解密值上添加谓词后,所有查询的速度应至少与三个查询中最慢的一个一样慢,这与您最终希望运行的查询更为一致

实际上,由于您希望在解密值上有一个谓词,并且由于加密密钥是在运行时传入的,因此在对结果排序之前,您必须对表进行完整扫描,解密每一行。随着数据量的增加,这将非常缓慢。当你谈论“分页视图”时,它通常与你所描述的内容不一致。由于每次运行此查询时都必须解密每一行,因此您不希望编写一个返回前10行的查询,然后发出另一个查询来获取第11-20行,以此类推。每次获取一页数据时,都需要重新解密表中的每一行


如果您使用的是11g,那么使用结果缓存功能可能会允许您发出单独的查询,以合理高效的方式获取数据的各个页面。但这在10g中不可用。

您可以发布查询计划吗?您如何测量经过的时间?您是否正在测量获取第一行所需的时间?或者获取最后一行所需的时间?存在哪些索引?特别是(
seq
name
)上是否有复合索引?大多数GUI工具记录开始返回结果的时间,而不是获取最后结果的时间。大多数GUI工具不会尝试获取最后一行,除非您执行滚动到结果集末尾之类的操作。您确定SmartSQL与大多数工具(TOAD、SQL Developer等)不同,并且显示获取最后一行而不是第一行的时间吗?@JustinCave您是对的,因为我向下滚动它一次检索100多行。不过,我不知道这有什么关系。另外,我正在安装SQL Developer,因为当我尝试
解释计划时,SmartSQL只显示“查询成功”。当我得到执行计划时,我会添加它们。你能发布完整的查询吗?看起来您正在连接两个表,
seq
列来自其中一个表,而
name
来自另一个表吗?如果比较不同查询的运行时,完全有可能最快获取第一行的计划与最快获取最后一行的计划不同。如果您试图处理所有行,那么您可能会关心获取最后一行的时间。对于某些前端,您可能更喜欢优化获取第一行的时间。我已经修改了查询和执行计划。。。另一个表为空,不影响性能。这里的目标是显示分页视图,因此我希望在解密和排序后检索x到x+10行。(我确实需要先解密,因为我将在诸如“%something%”
之类的
名称条件下进行解密)这就是我如此困惑的原因。它们看起来一样,但其中一个的时间是另一个的10倍。即使不看工具给我的时间,其中一个似乎是立即加载的,而另一个显然需要几秒钟。@b战神-您确定要考虑缓存的数据的差异吗?例如,您是否连续运行每个查询3次(每次获取所有行)并仅使用第3次执行时间(前两次执行用于缓存)
------------------------------------------------------------------------------------
| Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                |  8810 |  1453K|    98   (3)| 00:00:02 |
|   1 |  TABLE ACCESS FULL| CSTN_MEMB_INFO |  8810 |  1453K|    98   (3)| 00:00:02 |
------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
| Id  | Operation          | Name           | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                |  8810 |  1453K|       |   428   (1)| 00:00:06 |
|   1 |  SORT ORDER BY     |                |  8810 |  1453K|  3448K|   428   (1)| 00:00:06 |
|   2 |   TABLE ACCESS FULL| CSTN_MEMB_INFO |  8810 |  1453K|       |    98   (3)| 00:00:02 |
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
| Id  | Operation          | Name           | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                |  8810 |  1453K|       |   428   (1)| 00:00:06 |
|   1 |  SORT ORDER BY     |                |  8810 |  1453K|  3448K|   428   (1)| 00:00:06 |
|   2 |   TABLE ACCESS FULL| CSTN_MEMB_INFO |  8810 |  1453K|       |    98   (3)| 00:00:02 |
---------------------------------------------------------------------------------------------
select 
    seq, gender, wdate, address, 
    my_crypto_pkg.decrypt(tel, 'my_secret_key'), 
    my_crypto_pkg.decrypt(name, 'my_secret_key') 
from cstn_memb_info
--  where my_crypto_pkg.decrypt(name, 'my_secret_key') like ?
order by
    seq desc