我有一个Oracle数据库表LOG_MESSAGES
,其中一个名为MESSAGE
的CLOB列。某些行包含相同的MESSAGE
。
对于每个至少有重复的MESSAGE
,我想知道重复的数量。相当多的这些CLOB都很庞大(> 100 kB),因此转换为VARCHAR2
是不可能的。由于许多传统方法(例如GROUP BY
)无法与CLOB
一起使用,有人可以启发我吗?
有关信息,该表非常大(约1 TB)。因此,非常感谢优化方法。
提前感谢您的帮助。
答案 0 :(得分:4)
dbms_crypto.hash
可以接受CLOB
并计算哈希值。然后,您可以按哈希进行分组。当然,就CPU消耗而言,在大CLOB
上计算散列将是一个昂贵的过程。如果您有大量行,则可能需要相当长的时间。您可能希望在一个步骤中计算和存储哈希值,并在单独的步骤中执行GROUP BY
。
答案 1 :(得分:1)
我认为这个问题很多,但不幸的是,这似乎没有一个完美的方法。有些方法可以正常工作。
搜索“clob group by”或“clob distinct”,您将在本网站上看到几个点击。
一种方法是编写一个PL / SQL脚本,在表中的所有clob之间执行DBMS_LOB.COMPARE
,但效率可能是O(n ^ 2)的顺序,这会使它变得非常慢为了你的目的。
另一种被广泛接受的方法是使用dbms_crypto获取clob的哈希值(我认为它允许在clobs上进行散列),然后对哈希值进行分组。存在哈希冲突的可能性,但概率很小。我读到2 ^ 80左右的某个地方(但数字可能不对)。这不会像第一种方法那么慢,但计算哈希值也会花费不可忽略的时间。
我建议先尝试哈希方法,如果这看起来太慢,请寻找替代方案。