3

当我尝试运行以下查询(甚至尝试获取估计的执行计划)时,它非常慢,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(max)。为什么优化器不先使用它?这很合乎逻辑,不是吗?如果内容是否为空,它似乎正在检查表 File 中的所有行,然后应用 WHERE FileID = '....'

4

1 回答 1

2

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

如果您不确定查询计划在哪里,那么在 SSMS 中,查询,显示查询计划

高温高压

于 2013-06-05T15:11:44.587 回答