Sql server SQL连接运行缓慢

Sql server SQL连接运行缓慢,sql-server,Sql Server,我有两个sql查询做同样的事情,第一个查询需要13秒执行,而第二个查询需要1秒执行。有什么原因吗 没有必要ProcessMessages中的所有ID都将在ProcessMessageDetails中包含数据 --执行需要13秒 Select * from dbo.ProcessMessages t1 join dbo.ProcessMessageDetails t2 on t1.ProcessMessageId = t2.ProcessMessageId Where Id =

我有两个sql查询做同样的事情,第一个查询需要13秒执行,而第二个查询需要1秒执行。有什么原因吗

没有必要ProcessMessages中的所有ID都将在ProcessMessageDetails中包含数据

--执行需要13秒

 Select  * from dbo.ProcessMessages t1
   join dbo.ProcessMessageDetails t2 on t1.ProcessMessageId = t2.ProcessMessageId
    Where Id = 4 and Isdone = 0
--执行需要不到一秒的时间

   Select * from dbo.ProcessMessageDetails
    where ProcessMessageId in ( Select  distinct ProcessMessageId  from dbo.ProcessMessages t1
    Where  Where Id = 4 and Isdone = 0 )

我在t1.processMessageId(Pk)上有集群索引,在t2.processMessageId(FK)上有非集群索引。

我需要实际的执行计划来告诉您SqlServer在幕后到底在做什么。我可以告诉你,这些查询并没有做完全相同的事情

第一个查询是遍历并查找满足t1条件的所有项,查找t2条件的所有项,然后查找匹配的项并将它们连接在一起

第二个是说,首先从t1中找到符合我的条件的所有项,然后在t2中找到具有这些ID之一的项


根据您的统计信息、可用索引、硬件、表大小:Sql Server可能决定执行不同类型的扫描,或为查询的每个部分选择数据,而且它也可能决定以某种方式将数据连接在一起。

您的问题的答案非常简单。与第二个查询相比,使用的第一个查询将生成更多的行,因此搜索这些多行将花费更多的时间。这就是为什么第一个查询需要13秒,第二个查询只需要1秒的原因第二


因此,通常建议您在加入之前应用您的条件,否则您的行数将增加,然后您将需要更多时间在加入时搜索这些行。

id和isdone来自哪些表?另外,在第一个示例中,您有一个正在解析的1-M联接,而在第二个示例中,引擎不必联接表。Id和Isdone来自dbo.ProcessMessages t1。我已经为Id和ISDONE创建了一个非聚集索引。您可以添加执行计划吗?您是否查看了两个查询的执行计划以了解差异?请共享两个查询计划。