在更改之前,我有一个持续计算字段,它使用Checksum
函数和索引来使用它。SQL Server和持久计算字段与哈希字节
alter table Softs add TitleHash AS (CHECKSUM([Title])) PERSISTED;
一切都很好,直到我们发现Checksum产生较差的散列并且可能发生重复。所以我们决定使用Hashbytes。 我都尝试用二进制结果和焦炭结果
alter table Softs add TitleHashCBin AS (CONVERT(BINARY(16),hashbytes('MD4',[Title]))) PERSISTED;
或
alter table Softs add TitleHashCChar AS (CONVERT(CHAR(32),hashbytes('MD4',[Title]),2)) 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字段使用索引。 计算字段到底是什么。有人可以解释我做错了什么,或者它是一个错误? 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语句,但像以前那样使用相同的执行计划...
编辑 我决定使用简单的二进制领域和插入/ UPDATE触发器来更新他们的任务。奇迹般有效。但是,目前还不清楚它为什么有这么奇怪的行为?..
谢谢!我已经使用您提供的新信息更新了我的帖子。选项似乎是正确的,但不幸的结果是相同的... – Cheburek