代码之家  ›  专栏  ›  技术社区  ›  Wil

在大型Oracle表中计数CLOB重复

  •  1
  • Wil  · 技术社区  · 9 年前

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

    对于每个 消息 至少有一个副本,我想知道副本的数量。相当多的CLOB是巨大的(>100kB),因此转换为 VARCHAR2 毫无疑问。由于许多传统方法,如 GROUP BY 不与一起工作 CLOB 有人能开导我吗?

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

    提前感谢您的帮助。

    2 回复  |  直到 9 年前
        1
  •  3
  •   Jeffrey Kemp    9 年前

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

        2
  •  1
  •   ruudvan    9 年前

    我认为这个问题被问了很多,但不幸的是,似乎没有一个完美的方法来解决这个问题。但也有一些方法可以很好地工作。

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

    一种方法是编写PL/SQL脚本 DBMS_LOB.COMPARE 在表中的所有块之间,但效率可能在O(n^2)的数量级,这将使它对于您的目的来说非常缓慢。

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

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