在更改之前,我有一個持續計算字段,它使用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