代码之家  ›  专栏  ›  技术社区  ›  Gavin

检查varbinary字段是否为空的策略?

  •  14
  • Gavin  · 技术社区  · 15 年前

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

    select top 100 * from Files where Content is null
    

    我会怀疑它很慢,因为它

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

    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 回复  |  直到 8 年前
        1
  •  9
  •   Thomas Mueller    15 年前

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

    但是,我会使用 ISNULL(DATALENGTH(Content), -1) 相反,这样您就可以区分长度0和空。或者只是使用 DATALENGTH(Content) . 我的意思是,在空字符串与空字符串相同的情况下,Microsoft SQL Server不是Oracle。

        2
  •  2
  •   Geoff Hardy    9 年前

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

    exec sp_updatestats
    

    这样做之后,查询运行得更快。