У меня есть два вида запроса с сделал ту же работу здесь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
В реальных условиях будет более сложный запрос, это просто простая версия для других читать
Вопрос:
Лучше использовать CTE вместо использования JOIN каждый раз, основываясь на производительности и избыточности?
Есть ли лучший способ выполнить этот запрос UNION или даже UNION ALL, кроме этого.
Проверьте план запроса. Я предполагаю, что CTE будет сложена, чтобы дать один и тот же план запроса оба раза, но, конечно, проверьте его. –
Результат плана запроса дал очень незначительные издержки, отличающиеся для этих двух типов запросов, даже время, потребляемое, едва заметное количество разных. Мог бы оставить его или переключить для реальной среды для тестирования. и настройте его дальше, если возникнут проблемы с производительностью. спасибо в любом случае .. – Dean
CTE действует как macro.CTE хорош для удобочитаемости, но его производительность не лучше по сравнению с временными таблицами, лучше использовать временную таблицу, если это возможно. Если вы объединяете несколько таблиц с миллионами строк записей в каждом, CTE будет выполнять значительно хуже временных таблиц. –