【问题标题】:Improve performance when Searching SQL by Large Data Type?按大数据类型搜索 SQL 时提高性能?
【发布时间】:2013-12-18 23:02:46
【问题描述】:
场景:
我在 .Net 上使用指纹识别系统。每个指纹模板都被捕获为长度为 1632 的字节数组类型,但大多数指纹模板并未使用全部长度。我将它们作为 VARBINARY 数据类型“模板”列插入到 SQL 数据库中。
现在要执行身份验证,我需要将我的输入指纹样本与每个 SQL 记录中的“模板”列(它是 VARBINARY 数据类型)进行比较。
问题:
我知道会有性能问题,因为“模板”列包含大型数据类型。我的问题是:在我的场景中,基于大型 VARBINARY 数据类型列搜索匹配记录的最佳方法是什么?任何帮助表示赞赏。
【问题讨论】:
标签:
.net
sql-server
performance
search
large-data
【解决方案1】:
想法——快速搜索只使用 16 个字节(存储计算列),使用索引
MSDN HashBytes
MSDN Computed persisted column
CREATE TABLE [Fingerprint] (
[ID] int NOT NULL IDENTITY
CONSTRAINT PK_Fingerprint PRIMARY KEY CLUSTERED
-- ,[UserID] int NOT NULL
,[FingerprintBin] VARBINARY(1632) NULL
,[SearchCriteria] as CAST(HASHBYTES('MD5',[FingerprintBin]) as BINARY(16)) PERSISTED
)
CREATE NONCLUSTERED INDEX [IX_Fingerprint_SearchCriteria] ON [Fingerprint] ([SearchCriteria]);
GO
测试数据
INSERT INTO [Fingerprint] ([FingerprintBin])
VALUES (0x010203040506)
GO
-- Insert 1000 random value
INSERT INTO [Fingerprint] ([FingerprintBin])
VALUES (NEWID())
GO 1000
快速搜索
DECLARE @FingerprintBin VARBINARY(1632) = 0x010203040506
-- Index seek in execution plan
SELECT [ID]
FROM [Fingerprint]
WHERE [SearchCriteria] = CAST(HASHBYTES('MD5',@FingerprintBin) as BINARY(16))
AND [FingerprintBin] = @FingerprintBin;
GO