过去,我曾在查询varbinary(max)列时注意到糟糕的性能。可以理解,但是在检查它是否为null时也似乎会发生,我希望引擎改用一些捷径。
select top 100 * from Files where Content is null
我会怀疑它很慢,因为它
这个问题似乎与我的慢速前提不同,但是我似乎一次又一次地遇到二进制字段的性能问题。
一个可能的解决方案,我认为是让计算列 的 索引:
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
那是有效的策略吗?当涉及二进制字段时,还有什么其他方法可以有效地查询?
我认为它很慢,因为varbinary列没有(也不能被索引)。因此,您使用计算(和索引)列的方法是有效的。
但是,我将改用ISNULL(DATALENGTH(Content),-1)长度,以便您可以区分长度0和NULL。或只是使用DATALENGTH(Content)。我的意思是,Microsoft SQLServer不是Oracle,其中空字符串与NULL相同。
ISNULL(DATALENGTH(Content),-1)
DATALENGTH(Content)