目前,由于子句中的条件,我有两个 SQL 查询提案多次调用DATALENGTH
同一列。VARBINARY
WHERE
同一查询中的这些多次调用是否会DATALENGTH
影响性能,或者DATALENGTH
计算结果是否可以由 Microsoft SQL Server 优化/缓存?
目标是为列构建EndsWith
SQL 查询VARBINARY(MAX) FILESTREAM
。
就我而言,我无法向表中添加任何额外的索引或列,但是我想了解可能的替代方法。
-- Table with BinData
DECLARE @foo TABLE(BinData VARBINARY(MAX));
INSERT INTO @foo (BinData) VALUES
(0x00001125), (0x00112500), (0x11250000),
(0x00000011), (0x00001100), (0x00110000), (0x11000000),
(0x112500001125);
-- BinKey
DECLARE @BinKey VARBINARY(MAX) = 0x1125;
-- Search for [BinData] ending with @BinKey --
到目前为止我尝试过的...
建议A - REVERSE
BinKey和BinData,然后使用CHARINDEX
。
SELECT * FROM @foo WHERE
DATALENGTH(BinData) >= DATALENGTH(@BinKey) AND
CHARINDEX
(
CONVERT(VARCHAR(MAX), @BinKey),
CONVERT(VARCHAR(MAX), BinData)
) = 1 + DATALENGTH(BinData) - DATALENGTH(@BinKey);
建议 B - 剪切BinData的结尾部分并将其与BinKey进行比较。
SELECT * FROM @foo WHERE
DATALENGTH(BinData) >= DATALENGTH(@BinKey) AND
SUBSTRING(
BinData,
1 + DATALENGTH(BinData) - DATALENGTH(@BinKey),
DATALENGTH(@BinKey)
) = @BinKey;
James L. 的建议- 只需使用该RIGHT
功能。
SELECT * FROM @foo WHERE
RIGHT(BinData, DATALENGTH(@BinKey)) = @BinKey;
上面列出的查询的结果必须是:
0x00001125
0x112500001125
有没有更好的算法呢?对于较大的 blob,它的性能如何?