У меня есть таблица Notes
с столбцом uniqueidentifier
, который я использую в качестве FK для множества других таблиц в базе данных (не волнуйтесь, столбцы uniqueidentifier
на других таблицах не являются кластерными ПК). Эти другие таблицы представляют собой что-то вроде иерархии бизнес-объектов. В качестве простого представления, скажем, у меня есть две другие таблицы:Может ли UNION ALL быть быстрее, чем JOINs, или мои JOINs просто сосут?
- приводит (PK LeadID)
- Котировки (PK QuoteID, FK LeadID)
В показа Lead
в приложении, мне нужно показать все заметки, связанные со свинцом, включая те, помеченные любым Quote
, принадлежащим этому руководству. У меня есть два варианта, насколько я вижу - либо UNION ALL
, либо несколько операторов LEFT JOIN
. Вот как они выглядят:
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
Или ...
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
В реальной жизни у меня есть в общей сложности пять таблиц, ноты могут быть прикреплены к, и это число может вырасти, как приложение растет. У меня уже есть некластеризованные индексы, установленные в столбцах uniqueidentifier
, которые я использую, и SQL Profiler говорит, что я не могу сделать никаких улучшений, но когда я выполняю тест производительности в наборе тестовых данных с реалистичным размером, я получаю следующие цифры:
UNION ALL
- 0,010 секLEFT JOIN
- 0,744 сек
Я всегда слышал, что с помощью UNION
было плохо, и что UNION ALL
лишь незначительно лучше, но показатели производительности не» Кажется, что это не так. Конечно, код SQL-кода UNION ALL
может быть больнее поддерживать, но при такой разнице в производительности это, вероятно, стоит того.
ли вы запустить UNION или первый РЕГИСТРИРУЙТЕСЬ запрос? Помните, что в SQL Server ваши запросы могут быть кэшированы, что может дать вам более быстрый результат при втором запуске. – JNK
В моих тестах я сначала запустил UNION. В обоих случаях я бегал их несколько раз. Первый запуск любого запроса был определенно медленнее последующих запусков, но числа были выровнены в то время, когда я перечислил. –