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

Count CLOB Duplicates in a large Oracle Table

我有一个 Oracle 数据库 table LOG_MESSAGES,其中有一个名为 MESSAGE 的 CLOB 列。一些行包含相同的 MESSAGE

对于每个至少有一个重复项的 MESSAGE,我想知道重复项的数量。这些 CLOB 中有相当一部分是巨大的(> 100 kB),因此转换为 VARCHAR2 是不可能的。由于许多传统方法如 GROUP BY 不适用于 CLOB,有人可以赐教吗?

供参考,table 非常大(大约 1 TB)。因此,非常感谢优化方法。

提前感谢您的帮助。

dbms_crypto.hash 可以接受 CLOB 并计算哈希值。然后您可以按哈希分组。当然,就 CPU 消耗而言,在大型 CLOB 上计算哈希将是一个昂贵的过程。如果您有大量行,则可能需要相当长的时间。您可能希望在一个步骤中计算和存储哈希,然后在单独的步骤中执行 GROUP BY

我认为这个问题被问了很多,但不幸的是似乎没有完美的方法来做到这一点。不过有一些方法可以正常工作。

搜索 "clob group by" 或 "clob distinct",您将在此网站上看到多个匹配结果。

一种方法是编写一个 PL/SQL 脚本,在 table 中的所有 clob 之间执行 DBMS_LOB.COMPARE,但效率可能是 O(n^ 2) 这会让它对你的目的来说真的很慢。

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

我建议首先尝试哈希方法,如果它看起来太慢,请寻找替代方法。