【发布时间】:2017-04-03 11:20:21
【问题描述】:
我有一个复杂的查询,它使用了很多二进制校验和函数,当我用一些测试数据对两个不同的记录进行测试时,它实际上返回了相同的校验和值。请在下面找到我使用的测试数据
SELECT BINARY_CHECKSUM(16 ,'EP30461105',1) AS BinaryCheckSumEx UNION ALL
SELECT BINARY_CHECKSUM(21 ,'EP30461155',1) AS BinaryCheckSumEx
现在我正在尝试将 HASHBYTES 函数与“MD5”算法一起使用,我可以确定获得唯一记录,但现在我担心的是,在当前查询中,我使用“校验和”值加入我的 '合并'语句以查找新记录。由于“HashBytes”返回给我 Varbinary 数据类型,当我用“HashByte”字段替换连接条件时,我可以预期多少性能开销。
SELECT HASHBYTES('MD5', CONCAT(Col1,Col2,Col3,Col4,..))
此外,我需要为多个列创建散列,在这种情况下,我需要一个额外的 Concat 函数,这会对我的性能产生额外的开销。
【问题讨论】:
-
标记您正在使用的 dbms。该功能是特定于产品的。
-
校验和不是加密哈希,对于唯一标识数据没有用处。还要考虑
concat('abc', 'd')和concat('a', 'bcd')的哈希值是一样的。 -
您是否肯定没有散列的查询 - 即可以优化和利用索引的查询实际上比散列和比较效率低?
-
@AlexK。我很确定,当连接返回相同的值时,我不会期望多列的这种连接情况。
-
@AlexK。我们尝试使用哈希值或校验和值的主要原因是在合并语句中使用它来查找是否创建了任何新记录(基于目标表中的组字段)。如果我切换到 HashBytes,我必须将连接条件字段从“int”更新为“varbinary”,这对我的性能有多大影响是我的查询。
标签: sql sql-server-2012 database-performance checksum hashbytes