20

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

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

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

4

2 回答 2

13

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

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

于 2010-09-23T06:26:25.743 回答
3

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

exec sp_updatestats

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

于 2016-09-15T16:37:06.653 回答