SQL Server › Hash Indexes & Hash Join Operations

How would you troubleshoot a query that is unexpectedly using a slow hash join when a much faster index seek and nested loop join should be possible?

Advanced

Answer

You would check whether appropriate indexes actually exist on the join columns, verify that statistics on both tables are up to date so the optimizer can make accurate estimates, and review whether a function or implicit data type conversion applied to the join column is preventing the optimizer from being able to use an available index at all.
-- An implicit conversion due to mismatched data types
-- can prevent efficient index usage
SELECT * FROM Orders o
JOIN Customers c ON o.CustomerIdText = c.CustomerId; -- mismatched types
Real-world example A developer discovers a slow hash join was happening because one table stored a customer id as text while the other stored it as an integer, and after fixing the data type mismatch, the query switched to a much faster index seek with a nested loop join.

Common follow-ups: How do you detect an implicit conversion issue in an execution plan?;What is the performance cost of an implicit conversion on a join column?