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)
给定方法有什么替代方案吗?
在这里,使用计算列来存储前19个字节,PERSISTED以便您可以对其进行索引.
当我执行链接测试时,持久化和索引方法的速度提高了约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可能是有用的.
是否可以创建包含前19个字节的附加二进制列?
如果是这样,您可以将其创建为持久计算列,也可以创建为"实际"列,并创建一个INSERT触发器,在添加记录时填充它(UPDATE如果记录更新,则触发它).
然后,您可以索引新列,并重写查询以与该列进行比较,您将失去昂贵的子字符串操作.
| 归档时间: |
|
| 查看次数: |
3430 次 |
| 最近记录: |