2015-12-11 143 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 ALL查询以外的这些方式。

+0

检查您的查询计划。我的猜测是,CTE将被折叠以同时提供相同的查询计划,但要确保检查它。 –

+0

对于这两种查询类型,查询计划结果给出的代价非常小,即使时间消耗也几乎不明显。可能会离开它或切换到真实环境进行测试。如果出现性能问题,请进一步调整。无论如何.. – Dean

+2

CTE的行为像macro.CTE是可读性好,但它的表现并不比临时表更好使用临时表,如果可能的话。如果您要连接多个表,并且每个表中都有数百万行记录,则CTE的性能将显着低于临时表。 –

回答

0

我不认为在你的情况下,CTE和JOIN会有什么大的区别。 SQL Server优化会将其转换为完全不同的东西,这两个查询可能会产生相同的结果。如果选择性很高,您可以尝试在TotalAmount和Quantity上添加索引。

+0

关于使用索引的好处,虐待它进一步调整..谢谢任何地方 – Dean