2017-06-16 139 views
1

我有2个SQL查询做同样的事情,第一个查询需要13秒执行,而第二个需要1秒执行。任何理由?SQL连接运行缓慢

没必要在所有的ProcessMessages ID将在ProcessMessageDetails

数据 - 需要13秒来执行秒下

Select * from dbo.ProcessMessages t1 
    join dbo.ProcessMessageDetails t2 on t1.ProcessMessageId = t2.ProcessMessageId 
    Where Id = 4 and Isdone = 0 

--takes执行

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

从什么表是ID和ISDONE来源?在第一个中,你有一个1-M连接被解析,而在第二个连接中,引擎不需要连接这些表。 – xQbert

+0

Id和Isdone来源于dbo.ProcessMessages t1。我为Id和IsDone创建了非聚集索引 – user1005310

+1

您可以添加执行计划吗? – Naruto

回答

1

我需要实际的执行计划来确切地告诉你SqlServer在幕后做了些什么。我可以告诉你这些查询并不完全一样。

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

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

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