【问题标题】:Strategies for checking ISNULL on varbinary fields?检查 varbinary 字段上的 ISNULL 的策略?
【发布时间】:2011-04-16 01:59:27
【问题描述】:

过去,我注意到查询 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

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

【问题讨论】:

    标签: sql sql-server performance binary varbinary


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      exec sp_updatestats
      

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

      【讨论】:

      • 感谢您发布此建议。它把我 4 分钟以上的失控查询变成了 1 秒的查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      相关资源
      最近更新 更多