下面有兩個查詢除了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