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

时间:2010-09-23 04:24:43

标签: sql sql-server performance binary varbinary

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

select top 100 * from Files where Content is null

我怀疑它很慢,因为它是

  1. 需要将整个二进制文件拉出来,
  2. 它没有被索引(varbinary不能成为正常索引的一部分)
  3. This question似乎不同意我这里缓慢的前提,但我似乎一次又一次地遇到二进制字段的性能问题。

    我想到的一个可能的解决方案是创建 索引的计算列:

    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
    

    这是一个有效的策略吗?当涉及二进制字段时,有哪些其他方法可以有效地进行查询?

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

在查找varbinary值不为null的行时,我们遇到了类似的问题。对我们来说,解决方案是更新数据库的统计信息:

exec sp_updatestats

执行此操作后,查询运行得更快。