检查varbinary(max)列是否为null非常慢

时间:2013-06-05 14:15:17

标签: sql sql-server performance sql-server-2008 varbinarymax

当我尝试运行以下查询(或者甚至尝试获取估计的执行计划)时,它非常慢,超过10分钟(我停止等待):

SELECT TOP 1 1
    FROM File WITH (NOLOCK) 
WHERE FileID = '5021ECD3-2012-62E0-1F12-000041CCB35A' 
    AND FileSize > 0
    AND Content IS NULL

但是,以下是即时的:

DECLARE @test varbinary(1)

SELECT TOP 1 @test = Content
    FROM File WITH (NOLOCK) 
WHERE FileID = '5021ECD3-2012-62E0-1F12-000041CCB35A' 
    AND FileSize > 0

IF @test IS NULL
    PRINT 'a'

FileID上有一个唯一索引。内容是varbinary(最大)。为什么优化器不首先使用它?那将是非常合乎逻辑的,不是吗?它似乎是检查表文件中的所有行,如果内容为null,然后应用WHERE FileID ='....'

1 个答案:

答案 0 :(得分:2)

我怀疑你是否对你的第一个查询做了一个查询计划,然后该计划将进行表扫描,寻找内容= NULL,可能没有索引?另一方面,第二个查询仅在FileID上进行查找,一旦找到它就会返回。当然,如果(第一个)FileId ='5021ECD3-2012-62E0-1F12-000041CCB35A'的内容不为空,则第二个查询将继续查找直到表的末尾。 FileID是否有唯一约束?如果没有,那么你已经告诉查询优化器可能是表格中某处有这个文件ID的另一行....所以你不能责怪它看。正如一位着名的探险家在离开帐篷时所说的......我可能还有一段时间......

如果您不确定查询计划在SSMS,查询,显示查询计划

中的位置

HTH