我们需要能够计算外部环境下的表哈希值,并将其与内部环境下预先计算的哈希值进行比较。这样做的目的是确保外部环境中的数据没有被“不法”数据库管理员篡改。用户坚持要使用这个功能。
目前,我们通过计算每个列值的单独哈希值,在列哈希上执行位异或以获取行哈希,然后在所有行哈希上执行位异或以得到表哈希。以下是伪代码:
目前,我们通过计算每个列值的单独哈希值,在列哈希上执行位异或以获取行哈希,然后在所有行哈希上执行位异或以得到表哈希。以下是伪代码:
cursor hash_cur is
select /*+ PARALLEL(4)*/ dbms_crypto.mac(column1_in_raw_type, HMAC_SH512, string_to_raw('COLUMN1_NAME')) as COLUMN1_NAME
...
from TABLE_NAME;
open hash_cur;
fetch hash_cur bulk collect into hashes;
close hash_cur;
for i in 1..hashes.count
loop
rec := hashes(i);
record_xor = rec.COLUMN1;
record_xor = bit_xor(record_xor, rec.COLUMN2);
...
record_xor = bit_xor(record_xor, rec.COLUMNN);
table_xor = bit_xor(table_xor, record_xor);
end loop;
使用dbms_job可以并行运行上述伪脚本。
问题在于,对于某些表,我们有数千兆字节的数据,目前的性能不符合我们想要实现的性能。哈希必须“即时”完成,因为用户希望自己执行哈希检查。
- 你们有更好的方法来执行整个表的哈希,或者基本上比较通过低延迟和相对低带宽的网络连接到不同环境中的表吗?
我认为这个操作更多地是CPU绑定而不是I/O绑定。我考虑将表数据存储在blob中,其中数据按记录,然后按列适当排列。然后对输出文件执行哈希。这应该使操作完全成为I/O绑定。
- 最快的方法是什么?是否有办法在查询的select子句中执行此操作,以消除任何开销PL/SQL-to-SQL引擎上下文切换?
- 我考虑为此修改全局blob
- 还希望消除批量收集结果的I/O开销。
任何可以帮助我编写性能更好的脚本的建议都将不胜感激。谢谢。