T-SQL中varbinary比较的性能

sll*_*sll 10 sql t-sql comparison performance sql-server-2008

其中一个表列是VARBINARY类型,需要引发查询以评估特定字节模式的行,以下方法会显着降低性能:

declare @pattern varbinary

// 19 bytes constant
set @pattern = 0x00.....

-- r.payload is of VARBINARY type as well
SELECT .... FROM ...
WHERE substring(r.payload, 0, 19) <> @pattern
Run Code Online (Sandbox Code Playgroud)

给定方法有什么替代方案吗?

Jod*_*ell 9

在这里,使用计算列来存储前19个字节,PERSISTED以便您可以对其进行索引.

可以在SQLFiddle上找到演示.

当我执行链接测试时,持久化和索引方法的速度提高了约5倍.如果平均值[Payload]非常大,这可能会显着增加.

CREATE TABLE [dbo].[YourTable]
(
    [Id] INT CONSTRAINT [PK_YourTable] PRIMARY KEY,
    [Payload] VARBINARY(MAX),
    [Prefix] AS CAST([Payload] AS BINARY(19)) PERSISTED
);

CREATE NONCLUSTERED INDEX [IX_YourTable_Prefix] ON [YourTable]([Prefix]);
Run Code Online (Sandbox Code Playgroud)

允许,

SELECT
            [Id]
    FROM
            [YourTable]
    WHERE
            [Prefix] <> @pattern 
Run Code Online (Sandbox Code Playgroud)

或者其他一些.


我并不完全清楚你想要实现什么,但可能使用它HASHBYTES可能是有用的.


Ed *_*d B 5

是否可以创建包含前19个字节的附加二进制列?

如果是这样,您可以将其创建为持久计算列,也可以创建为"实际"列,并创建一个INSERT触发器,在添加记录时填充它(UPDATE如果记录更新,则触发它).

然后,您可以索引新列,并重写查询以与该列进行比较,您将失去昂贵的子字符串操作.