【问题标题】:Count CLOB Duplicates in a large Oracle Table计算大型 Oracle 表中的 CLOB 重复项
【发布时间】:2015-03-06 21:05:33
【问题描述】:

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

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

有关信息,该表非常大(大约 1 TB)。因此,非常感谢优化方法。

提前感谢您的帮助。

【问题讨论】:

    标签: sql oracle plsql duplicates clob


    【解决方案1】:

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

    【讨论】:

    • 感谢您快速而有用的回答! ruudvan 和您对DBMS_LOB.HASH 的回答都非常好。我已经勾选了他的更多细节。
    【解决方案2】:

    我认为这个问题被问了很多,但不幸的是,似乎没有一个完美的方法来做到这一点。不过,有些方法效果很好。

    搜索“clob group by”或“clob distinct”,您会在这个网站上看到几个点击。

    一种方法是编写一个 PL/SQL 脚本,在表中的所有 clob 之间执行 DBMS_LOB.COMPARE,但效率可能是 O(n^2) 的顺序,这会让你的速度非常慢目的。

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

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

    【讨论】:

    • 我也有在所有 CLOB 之间使用 DBMS_LOB.COMPARE 的想法,但是行数太多。这就是为什么我更精确的表是巨大的。选择了第二种方法,非常感谢有关可能碰撞的额外信息。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多