我正在尝试比较oracle数据库中两个表之间的大字符串(5,000 - 80,000个字符(,并简单地确定是否存在任何差异。我计划在存储字符串之前将字符串转换为 BLOB,并且正在寻找两种进行比较的方法。
使用DBMS_LOB.compare 函数与使用 MD5 哈希函数并生成校验和来比较两个 BLOB 在性能和准确性方面可能存在哪些差异?
只是通过使用常识...
案例 1 – 首次dbms_lob.compare()
价格为:
- 阅读整个 LOB #1。
- 阅读整个 LOB #2。
我们可以忽略实际的比较,因为这是在内存中完成的,而读取 LOB 是从磁盘完成的。
总体价格 = 2 x 从磁盘读取。
案例 1 – 后续调用的dbms_lob.compare()
价格为:
- 阅读整个 LOB #1。
- 阅读整个 LOB #2。
我们可以忽略实际的比较,因为这是在内存中完成的,而读取 LOB 是从磁盘完成的。
总体价格 = 2 x 从磁盘读取。
案例 2 – 比较 MD5 哈希
价格为:
- 阅读整个 LOB #1,从中计算 MD5。
- 阅读整个LOB #2,从中计算MD5。
我们可以忽略实际的比较,因为这是在内存中完成的,只比较短的字节序列。
总体价格 = 2 x 磁盘读数 + 2 x 计算 MD5。
我相信MD5可以在现代CPU上没有明显性能下降的情况下计算,因此我建议忽略MD5的整体价格估算计算。因此。。。
总体价格 = 2 x 从磁盘读取。
案例 2 – 比较后续调用的 MD5 哈希
假设您的 LOB 没有更改,因此您预先创建和存储的 MD5 校验和对于未更改的 LOB 是正确的,则价格为...好吧,没有从磁盘读取 LOB;只有预先计算的 MD5 校验和的比较,所以......
总价 = 常数 1
结论
现在,您可以选择最适合您的内容。
如果需要一次性比较,请使用dbms_lob.compare()
。
但是,如果您需要例如将每个 LOB 与每个 LOB 进行比较(= n ×n个比较总数(,那么您肯定会最好预先计算 MD5 校验和,然后比较校验和。