一尘不染

计算大型Oracle表中的CLOB重复项

sql

我有一个LOG_MESSAGES名为CLOB的Oracle数据库表MESSAGE。一些行包含相同的行MESSAGE

对于每个MESSAGE至少有一个重复项,我想知道重复项的数量。这些CLOB中有很多很大(> 100
kB),因此转换为VARCHAR2是毫无疑问的。由于许多传统方法(例如)GROUP BY无法使用CLOB,有人可以启发我吗?

作为参考,该表非常大(大约1 TB)。因此,非常感谢您使用一种优化的方法。

预先感谢您的帮助。


阅读 229

收藏
2021-03-17

共1个答案

一尘不染

我认为这个问题被问了很多,但是不幸的是,这似乎并不是一种完美的方法。虽然有些方法可以正常工作。

搜索“ clob分组依据”或“ clob独特”,您将在此网站上看到多个匹配项。

一种方法是编写一个PL / SQL脚本,该脚本DBMS_LOB.COMPARE在表中的所有Clob之间执行一个操作,但效率可能约为O(n ^
2),这实际上会使它变慢。

广为接受的另一种方法是使用dbms_crypto(我认为允许在Clob上进行散列)获取Clob的散列值,然后对散列值进行分组。可能会发生哈希冲突,但是概率很小。我读到2
^ 80左右的地方(尽管数字可能有误)。这不会像第一种方法那样慢,但是计算散列也将花费不可忽略的时间。

我建议先尝试使用散列方法,如果这看起来太慢,请寻找替代方法。

2021-03-17