我有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)上有非集群索引
答案 0 :(得分:1)
我需要实际的执行计划来告诉你SqlServer在幕后做了什么。我可以告诉你这些查询并没有做同样的事情。
第一个查询正在查找所有满足t1条件的项目,并查找t2的所有项目,然后查找哪些项目匹配并将它们连接在一起。
第二个是首先从t1找到符合我标准的所有项目,然后找到t2中具有其中一个ID的项目。
根据您的统计信息,可用索引,硬件,表大小:Sql Server可能决定执行不同类型的扫描或寻求为查询的每个部分选择数据,并且它还可能决定将数据连接在一起方式。
答案 1 :(得分:1)
你的问题的答案非常简单,与第二个查询相比,使用的第一个查询将产生更多的行数,因此搜索那么多行将需要更多时间,这是你的第一个查询需要13秒的时间。第二个只有一秒
因此,通常建议您在进行加入之前应用条件,否则行数会增加,然后在加入时需要更多时间来搜索这些行。