There are 2 queries below that are identical except for the JOIN to mjnEmployeeDepartment. The first query uses LEFT OUTER JOIN and the second uses INNER JOIN. They both return the same data but the INNER JOIN takes 4.5 minutes to execute whereas the LEFT OUTER JOIN takes 4 seconds. Can anyone suggest what might be happening here?
I am running the code in SMS 2017 against a SQL 2012 database.
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