当我尝试运行以下查询(或者甚至尝试获取估计的执行计划)时,它非常慢,超过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 ='....'
答案 0 :(得分:2)
我怀疑你是否对你的第一个查询做了一个查询计划,然后该计划将进行表扫描,寻找内容= NULL,可能没有索引?另一方面,第二个查询仅在FileID上进行查找,一旦找到它就会返回。当然,如果(第一个)FileId ='5021ECD3-2012-62E0-1F12-000041CCB35A'的内容不为空,则第二个查询将继续查找直到表的末尾。 FileID是否有唯一约束?如果没有,那么你已经告诉查询优化器可能是表格中某处有这个文件ID的另一行....所以你不能责怪它看。正如一位着名的探险家在离开帐篷时所说的......我可能还有一段时间......
如果您不确定查询计划在SSMS,查询,显示查询计划
中的位置HTH