【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多