I have a Notes
table with a uniqueidentifier
column that I use as a FK for a variety of other tables in the database (don't worry, the uniqueidentifier
columns on the other tables aren't clustered PKs). These other tables represent something of a hierarchy of business objects. As a simple representation, let's say I have two other tables:
- Leads (PK LeadID)
- Quotes (PK QuoteID, FK LeadID)
In the display of a Lead
in the application, I need to show all notes related to the lead, including those tagged to any Quote
that belongs to that lead. I have two options as far as I can see — either a UNION ALL
or several LEFT JOIN
statements. Here's how they'd look:
SELECT N.*
FROM Notes N
JOIN Leads L ON N.TargetUniqueID = L.UniqueID
WHERE L.LeadID = @LeadID
UNION ALL
SELECT N.*
FROM Notes N
JOIN Quotes Q ON N.TargetUniqueID = Q.UniqueID
WHERE Q.LeadID = @LeadID
Or...
SELECT N.*
FROM Notes N
LEFT JOIN Leads L ON N.TargetUniqueID = L.UniqueID
LEFT JOIN Quotes Q ON N.TargetUniqueID = Q.UniqueID
WHERE L.LeadID = @LeadID OR Q.LeadID = @LeadID
In real life I have a total of five tables that the notes could be attached to, and that number could grow as the application grows. I already have non-clustered indexes set up on the uniqueidentifier
columns I'm using, and SQL Profiler says I can't make any more improvements, but when I do a performance test on a realistically-sized test data set, I get the following numbers:
UNION ALL
— 0.010 secLEFT JOIN
— 0.744 sec
I had always heard that using UNION
was bad, and that UNION ALL
was only marginally better, but the performance numbers don't seem to bear that out. Granted, the UNION ALL
SQL code might be more of a pain to maintain, but at that kind of performance difference it's probably worth it.
So is UNION ALL
really better here or am I missing something on the LEFT JOIN
code that is slowing things down?