比较 SQL 服务器中的大量大字符串文本 - 如果比较哈希而不是字符串,性能是否更好
Comparing large number of big string text in SQL Server - Is Performance better if hash is compared instead of the strings
我的一个特定应用程序 (ASP.Net/C# & SQL Server Express 2014) 具有以下要求。在某个 UI 操作上,以下内容:
- 大约 120 多个文本块,每个大约 10,000 个字符 (unicode) 需要与另一组相应的 120 多个块进行比较。
- 此文本块包含 HTML,实际文本内容可能是任何语言。
我想到的解决方案是使用 HASHBYTES 并散列所有值并保留。当需要比较时,我会比较哈希值而不是大文本块。我将对这些值进行一次散列并保留(并在源值更改时重新散列)并多次使用它们进行比较。
这是我的问题:
- 从性能角度来看,我的解决方案是否最优?
- HASHBYTE(比如 SHA1 算法)是否存在哈希冲突?我应该在获得哈希匹配时检查字符串值吗?
比较哈希肯定比比较字符串快。即使忽略比较大字符串的 CPU 成本,由于它们是 nvarchar(max) 和 10,000 个字符,它们将在大对象存储(LOB 存储)中,而不是在行中,并且需要额外的磁盘输入输出。
如前所述,HASHBYTES 有 8000 字节的限制。为了克服这个问题,您需要将数据分成少于 4000 个字符的块(因为它们每个都是 2 个字节)并将它们散列成块。然后可以连接中间散列并对结果进行散列。
SHA1 哈希冲突的可能性很小。如果担心,建议使用 SHA_256。结果将是 32 个字节,而不是 SHA1 的 20 个字节。
LOB 存储:
http://www.sqlskills.com/blogs/kimberly/understanding-lob-data-20082008r2-2012/
我的一个特定应用程序 (ASP.Net/C# & SQL Server Express 2014) 具有以下要求。在某个 UI 操作上,以下内容:
- 大约 120 多个文本块,每个大约 10,000 个字符 (unicode) 需要与另一组相应的 120 多个块进行比较。
- 此文本块包含 HTML,实际文本内容可能是任何语言。
我想到的解决方案是使用 HASHBYTES 并散列所有值并保留。当需要比较时,我会比较哈希值而不是大文本块。我将对这些值进行一次散列并保留(并在源值更改时重新散列)并多次使用它们进行比较。
这是我的问题:
- 从性能角度来看,我的解决方案是否最优?
- HASHBYTE(比如 SHA1 算法)是否存在哈希冲突?我应该在获得哈希匹配时检查字符串值吗?
比较哈希肯定比比较字符串快。即使忽略比较大字符串的 CPU 成本,由于它们是 nvarchar(max) 和 10,000 个字符,它们将在大对象存储(LOB 存储)中,而不是在行中,并且需要额外的磁盘输入输出。
如前所述,HASHBYTES 有 8000 字节的限制。为了克服这个问题,您需要将数据分成少于 4000 个字符的块(因为它们每个都是 2 个字节)并将它们散列成块。然后可以连接中间散列并对结果进行散列。
SHA1 哈希冲突的可能性很小。如果担心,建议使用 SHA_256。结果将是 32 个字节,而不是 SHA1 的 20 个字节。
LOB 存储: http://www.sqlskills.com/blogs/kimberly/understanding-lob-data-20082008r2-2012/