一尘不染

检查varbinary字段上的ISNULL的策略?

sql

过去,我曾在查询varbinary(max)列时注意到糟糕的性能。可以理解,但是在检查它是否为null时也似乎会发生,我希望引擎改用一些捷径。

select top 100 * from Files where Content is null

我会怀疑它很慢,因为它

  1. 需要拉出整个二进制文件,并且
  2. 它没有索引(varbinary不能是普通索引的一部分)

这个问题似乎与我的慢速前提不同,但是我似乎一次又一次地遇到二进制字段的性能问题。

一个可能的解决方案,我认为是让计算列 索引:

alter table Files
add ContentLength as ISNULL(DATALENGTH(Content),0) persisted

CREATE NONCLUSTERED INDEX [IX_Files_ContentLength] ON [dbo].[Files] 
(
    [ContentLength] ASC
)

select top 100 * from Files where ContentLength = 0

那是有效的策略吗?当涉及二进制字段时,还有什么其他方法可以有效地查询?


阅读 125

收藏
2021-03-10

共1个答案

一尘不染

我认为它很慢,因为varbinary列没有(也不能被索引)。因此,您使用计算(和索引)列的方法是有效的。

但是,我将改用ISNULL(DATALENGTH(Content),-1)长度,以便您可以区分长度0和NULL。或只是使用DATALENGTH(Content)。我的意思是,Microsoft SQLServer不是Oracle,其中空字符串与NULL相同。

2021-03-10