为 CLOB 字段添加显式 SHA-256 哈希列是否会提高该 CLOB 字段的搜索(精确匹配)性能
Does adding an explicit column of SHA-256 hash for a CLOB field improve the search(exact match) performance on that CLOB field
我们需要实现一个 table(可能是一个 orable 数据库 table 或一个 mssql 数据库 table),如下所示:
- 一列存储一个字符串值,该字符串值的长度变化很大,通常从几个字节到 500 兆字节(偶尔超过 1 GB)
- 基于以上,我们决定在数据库中使用 CLOB 类型。(使用系统文件不是一个选项)
- table 非常大,有几百万条记录。
- 针对此 table 的最常见和最重要的操作之一是通过此 CLOB 列搜索记录,搜索字符串需要与此 CLOB 列值完全匹配。
我的问题是除了在 CLOB 列上添加索引外,我们是否需要做一些特定的优化来提高搜索性能?
我的一个团队成员建议添加一个额外的列来计算上面 CLOB 列的 SHA-256 哈希值,并按此哈希值而不是 CLOB 列进行搜索。就他的观点而言,这样做的理由是散列值是等长的而不是可变的,因此索引可以使搜索更快。
但是,我不认为这种方式有很大的不同,因为假设添加一个显式散列可以提高搜索性能,数据库应该足够智能,可以自己完成,很可能将这个散列值存储在数据库系统的一些隐藏位置.为什么要让我们开发人员明确地这样做呢,另一方面,这个哈希值理论上会产生冲突,尽管这种情况很少见。
我能想到的唯一好处是当数据库客户端搜索关键字非常大时,您可以通过将这个大值散列为一个小长度值来减少网络往返,因此网络传输更快.
所以任何数据库专家,请阐明这个问题。非常感谢!
常规索引不适用于 CLOB 列。相反,您需要创建一个 Oracle Text 索引,它主要用于键 words/phrases 的全文搜索,而不是全文匹配。
相比之下,通过计算列数据的散列函数,您可以在散列值上创建索引,因为它足够短以适合标准 VARCHAR2 或 RAW 列。这样的哈希函数可以显着减少您在尝试查找完全匹配项时的搜索 space。
您对哈希冲突的进一步担忧虽然并非毫无根据,但可以减轻。首先,散列冲突相对较少,但当它们确实发生时,文档不太可能非常相似,因此在检测到冲突的情况下可以使用直接文本比较。 A另外,由于散列函数的工作方式,对原始文档的微小更改会导致散列值发生重大变化,而对不同文档的相同更改对散列值的影响也不同,您可以计算原始文本的一个子集(或超集)的二级哈希值,以充当避免冲突的机制。
我们需要实现一个 table(可能是一个 orable 数据库 table 或一个 mssql 数据库 table),如下所示:
- 一列存储一个字符串值,该字符串值的长度变化很大,通常从几个字节到 500 兆字节(偶尔超过 1 GB)
- 基于以上,我们决定在数据库中使用 CLOB 类型。(使用系统文件不是一个选项)
- table 非常大,有几百万条记录。
- 针对此 table 的最常见和最重要的操作之一是通过此 CLOB 列搜索记录,搜索字符串需要与此 CLOB 列值完全匹配。
我的问题是除了在 CLOB 列上添加索引外,我们是否需要做一些特定的优化来提高搜索性能?
我的一个团队成员建议添加一个额外的列来计算上面 CLOB 列的 SHA-256 哈希值,并按此哈希值而不是 CLOB 列进行搜索。就他的观点而言,这样做的理由是散列值是等长的而不是可变的,因此索引可以使搜索更快。
但是,我不认为这种方式有很大的不同,因为假设添加一个显式散列可以提高搜索性能,数据库应该足够智能,可以自己完成,很可能将这个散列值存储在数据库系统的一些隐藏位置.为什么要让我们开发人员明确地这样做呢,另一方面,这个哈希值理论上会产生冲突,尽管这种情况很少见。
我能想到的唯一好处是当数据库客户端搜索关键字非常大时,您可以通过将这个大值散列为一个小长度值来减少网络往返,因此网络传输更快.
所以任何数据库专家,请阐明这个问题。非常感谢!
常规索引不适用于 CLOB 列。相反,您需要创建一个 Oracle Text 索引,它主要用于键 words/phrases 的全文搜索,而不是全文匹配。
相比之下,通过计算列数据的散列函数,您可以在散列值上创建索引,因为它足够短以适合标准 VARCHAR2 或 RAW 列。这样的哈希函数可以显着减少您在尝试查找完全匹配项时的搜索 space。
您对哈希冲突的进一步担忧虽然并非毫无根据,但可以减轻。首先,散列冲突相对较少,但当它们确实发生时,文档不太可能非常相似,因此在检测到冲突的情况下可以使用直接文本比较。 A另外,由于散列函数的工作方式,对原始文档的微小更改会导致散列值发生重大变化,而对不同文档的相同更改对散列值的影响也不同,您可以计算原始文本的一个子集(或超集)的二级哈希值,以充当避免冲突的机制。