下面有两个查询除了JOIN到mjnEmployeeDepartment以外是相同的。第一个查询使用LEFT OUTER JOIN,第二个使用INNER JOIN。他们都返回相同的数据,但INNER JOIN需要4.5分钟执行,而LEFT OUTER JOIN需要4秒。任何人都可以提出可能发生的事情吗?内部加入杀死查询性能
我正在运行SMS 2017中针对SQL 2012数据库的代码。
Select
Count(*) --23878 00:00:00
From
dbo.mjnEmployee as e
Inner Join dbo.mjnEmployeeStatus as s
on e.EmployeeID = s.EmployeeID
Inner Join dbo.mjnEmployeeEmploymentInfo as RankNo
On e.EmployeeId = RankNo.EmployeeID
Inner Join dbo.mjnEmployeeOfficeAssociation as Office
On e.EmployeeId = Office.EmployeeID
Inner Join dbo.mjnEmployeeEmploymentInfo as TrackNo
On e.EmployeeId = TrackNo.EmployeeID
Inner Join dbo.mjnEmployeeUnit as Unit
on e.EmployeeID = Unit.EmployeeID
And Unit.Iteration = 1
Left Outer Join dbo.mjnEmployeeDepartment as Department
on e.EmployeeID = Department.EmployeeID
Left Outer Join dbo.mjnEmployeeAssociation as Supervisor
On e.EmployeeId = Supervisor.ObjectEmployeeId
and Supervisor.EmployeeAssociationType = 2
Left Outer Join dbo.mjnEmployeeAssociation as Manager
On Manager.ObjectEmployeeId = e.EmployeeId
and Manager.EmployeeAssociationType = 1
Left Outer Join dbo.mjnEmployeeAssociation as Assistant
On e.EmployeeId = Assistant.ObjectEmployeeId
and Assistant.EmployeeAssociationType = 3
Left Outer Join dbo.mjnEmployeeAssociation as Advisor
On e.EmployeeId = Advisor.ObjectEmployeeId
and Advisor.EmployeeAssociationType = 4
Select
Count(*) --23878 00:04:37
From
dbo.mjnEmployee as e
Inner Join dbo.mjnEmployeeStatus as s
on e.EmployeeID = s.EmployeeID
Inner Join dbo.mjnEmployeeEmploymentInfo as RankNo
On e.EmployeeId = RankNo.EmployeeID
Inner Join dbo.mjnEmployeeOfficeAssociation as Office
On e.EmployeeId = Office.EmployeeID
Inner Join dbo.mjnEmployeeEmploymentInfo as TrackNo
On e.EmployeeId = TrackNo.EmployeeID
Inner Join dbo.mjnEmployeeUnit as Unit
on e.EmployeeID = Unit.EmployeeID
And Unit.Iteration = 1
Inner Join dbo.mjnEmployeeDepartment as Department
on e.EmployeeID = Department.EmployeeID
Left Outer Join dbo.mjnEmployeeAssociation as Supervisor
On e.EmployeeId = Supervisor.ObjectEmployeeId
and Supervisor.EmployeeAssociationType = 2
Left Outer Join dbo.mjnEmployeeAssociation as Manager
On Manager.ObjectEmployeeId = e.EmployeeId
and Manager.EmployeeAssociationType = 1
Left Outer Join dbo.mjnEmployeeAssociation as Assistant
On e.EmployeeId = Assistant.ObjectEmployeeId
and Assistant.EmployeeAssociationType = 3
Left Outer Join dbo.mjnEmployeeAssociation as Advisor
On e.EmployeeId = Advisor.ObjectEmployeeId
and Advisor.EmployeeAssociationType = 4
我的第一个想法是缺乏索引。 – duffymo
我也是达菲,但不会缺少索引影响左连接以及内连接?另外,当我查看执行计划时,SMS不会提示任何新的索引。 –
您应该[至少包含实际的执行计划](https://stackoverflow.com/a/7359705/1260204),您可以使用[粘贴计划](https://www.brentozar.com/pastetheplan /)并在你的问题中分享链接。另外[尝试自己读](https://stackoverflow.com/a/759097/1260204),也许你可以找出与您的查询性能问题(S)。最后,包括[schema DDL](https://en.wikipedia.org/wiki/Data_definition_language)以及正在执行的查询。 – Igor