2015-12-11 3 views
0

У меня есть два вида запроса с сделал ту же работу здесьT-SQL UNION вопрос производительности

Запрос 1:

SELECT MP.MemberName FROM MemberProfile MP 
LEFT JOIN Order O ON MP.MemberID = O.MemberID 
WHERE O.TotalAmount >= 100 

UNION 

SELECT MP.MemberName FROM MemberProfile MP 
LEFT JOIN Order O ON MP.MemberID = O.MemberID 
WHERE O.Quantity >= 10 

Запрос 2:

;WITH cte AS (
    SELECT MP.MemberName, O.Quantity, O.TotalAmount FROM MemberProfile MP 
    LEFT JOIN Order O ON MP.MemberID = O.MemberID 
) 
SELECT MemberName FROM cte WHERE TotalAmount >= 100 

UNION 

SELECT MemberName FROM cte WHERE Quantity >= 10 

В реальных условиях будет более сложный запрос, это просто простая версия для других читать

Вопрос:

  1. Лучше использовать CTE вместо использования JOIN каждый раз, основываясь на производительности и избыточности?

  2. Есть ли лучший способ выполнить этот запрос UNION или даже UNION ALL, кроме этого.

+0

Проверьте план запроса. Я предполагаю, что CTE будет сложена, чтобы дать один и тот же план запроса оба раза, но, конечно, проверьте его. –

+0

Результат плана запроса дал очень незначительные издержки, отличающиеся для этих двух типов запросов, даже время, потребляемое, едва заметное количество разных. Мог бы оставить его или переключить для реальной среды для тестирования. и настройте его дальше, если возникнут проблемы с производительностью. спасибо в любом случае .. – Dean

+2

CTE действует как macro.CTE хорош для удобочитаемости, но его производительность не лучше по сравнению с временными таблицами, лучше использовать временную таблицу, если это возможно. Если вы объединяете несколько таблиц с миллионами строк записей в каждом, CTE будет выполнять значительно хуже временных таблиц. –

ответ

0

Я не думаю, что в вашем случае будет какая-то большая разница между CTE и JOIN. Оптимизация SQL Server преобразует ее в нечто совершенно другое, и эти два запроса будут давать, вероятно, тот же результат. Вы можете попытаться добавить индексы на TotalAmount и Quantity, если селективность высока.

+0

Хороший пункт об использовании индексов, плохо попробуйте его для дальнейшей настройки .. спасибо где угодно – Dean

Смежные вопросы