SQL连接运行缓慢

时间:2017-06-16 18:01:09

标签: sql-server

我有2个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)上有非集群索引

2 个答案:

答案 0 :(得分:1)

我需要实际的执行计划来告诉你SqlServer在幕后做了什么。我可以告诉你这些查询并没有做同样的事情。

第一个查询正在查找所有满足t1条件的项目,并查找t2的所有项目,然后查找哪些项目匹配并将它们连接在一起。

第二个是首先从t1找到符合我标准的所有项目,然后找到t2中具有其中一个ID的项目。

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

答案 1 :(得分:1)

你的问题的答案非常简单,与第二个查询相比,使用的第一个查询将产生更多的行数,因此搜索那么多行将需要更多时间,这是你的第一个查询需要13秒的时间。第二个只有一秒

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