当我尝试运行以下查询(甚至尝试获取估计的执行计划)时,它非常慢,超过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中的所有行(如果内容是否为null),然后应用WHERE FileID ='....'

最佳答案

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

如果您不确定查询计划在SSMS中的哪个位置,则查询,显示查询计划

高温超导

关于sql - 检查varbinary(max)列是否为null确实很慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16942313/

10-11 03:00