SQL Server和具有哈希字节的持久化计算字段

SQL Server和具有哈希字节的持久化计算字段,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,在更改之前,我有一个持久化的计算字段,它使用校验和函数和索引来使用它 alter table Softs add TitleHash AS (CHECKSUM([Title])) PERSISTED; 所有这些都很好,直到我们发现校验和产生的哈希值很差,并且可能会出现重复。所以我们决定使用Hashbytes。 我尝试了二进制结果和char结果 alter table Softs add TitleHashCBin AS (CONVERT(BINARY(16),hashbytes('MD4',[

在更改之前,我有一个持久化的计算字段,它使用
校验和
函数和索引来使用它

alter table Softs add TitleHash AS (CHECKSUM([Title])) PERSISTED;
所有这些都很好,直到我们发现校验和产生的哈希值很差,并且可能会出现重复。所以我们决定使用Hashbytes。 我尝试了二进制结果和char结果

alter table Softs add TitleHashCBin AS (CONVERT(BINARY(16),hashbytes('MD4',[Title]))) PERSISTED;

不幸的是,我们发现一个简单的SELECT请求并没有对新字段使用索引

SELECT id FROM Softs WHERE TitleHashCBin = 0xC29939F6149FD65100A66AF5FD958D8B
它扫描构建在
Id
列上的主索引。

之后,我们创建了二进制列,从TitleHashCBin复制了数据,还为新列创建了索引

alter table Softs add TitleHashBin AS Binary(16)
并使用类似的select语句

SELECT id FROM Softs WHERE TitleHashBin = 0xC29939F6149FD65100A66AF5FD958D8B
这个使用TitleHashBin字段的索引。 计算字段到底是怎么回事。有人能解释一下我做错了什么,还是一个bug? P.S.Sql Server 2008 10.0.3798

编辑 我刚刚从表中删除了char列,以研究SSMS生成了什么。它生成的结果实际上与您描述的相同

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
--DROP INDEXes here
--GO
ALTER TABLE dbo.Softs DROP COLUMN TitleHashCChar, TitleHashChar
GO
ALTER TABLE dbo.Softs SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
所以我认为我们可以假设表选项是正确的。 之后,我重复了select语句,但执行计划与之前相同

编辑
我决定使用简单的二进制字段和插入/更新触发器来更新它们。工作起来很有魅力。但仍不清楚它为什么会有如此奇怪的行为?。

请确保设置的选项正确无误,从

设置选项要求 在执行定义计算列的CREATE TABLE或ALTER TABLE语句时,必须将ANSI_NULLS connection level选项设置为ON。OBJECTPROPERTY函数通过IsAnsiNullsOn属性报告该选项是否启用。 创建索引的连接以及尝试插入、更新或删除语句(这些语句将更改索引中的值)的所有连接必须将六个SET选项设置为on,一个选项设置为OFF。对于不具有这些相同选项设置的连接执行的任何SELECT语句,优化器将忽略计算列上的索引。 必须将NUMERIC_ROUNDABORT选项设置为OFF,并且必须将以下选项设置为ON:

ANSI_空值

ANSI_填充

ANSI_警告

阿里沙波特

CONCAT_NULL_产生_NULL

带引号的标识符


当数据库兼容性级别设置为90时,将ANSI_WARNINGS设置为ON会隐式地将ArithaPort设置为ON。如果数据库兼容性级别设置为80或更低,则ARITHABORT选项必须显式设置为ON。有关更多信息,请参见设置影响结果的选项。

谢谢!我已经用你的新信息更新了我的帖子。选项似乎是正确的,但不幸的是结果是一样的。。。
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
--DROP INDEXes here
--GO
ALTER TABLE dbo.Softs DROP COLUMN TitleHashCChar, TitleHashChar
GO
ALTER TABLE dbo.Softs SET (LOCK_ESCALATION = TABLE)
GO
COMMIT