UNION vs CROSS APPLY表现

时间:2014-07-24 03:57:53

标签: sql sql-server

昨天我问了一个question,一个答案让我想到了表现。

恢复,我有一张表代表父母关系的表:

PARENT | CHILD
   1   |   2
   1   |   3
   2   |   4

这两个字段都是代表一个人的数字。

我需要接受这个表的不同人群,如果孩子或父母不进口。在我脑海中首先出现的查询是最明显的:

 SELECT DISTINCT PARENT FROM TABLE1
 UNION SELECT DISTINCT CHILD FROM TABLE1

但是下面的一个似乎表现得更好(至少在我的真实数据中):

 SELECT DISTINCT CASE WHEN N.n=1 THEN parent ELSE child END 
 FROM TABLE1
 CROSS APPLY(SELECT 1 UNION SELECT 2)N(n)

我的问题是:

  • 第二个查询是否真的比我常建的第一个查询快?
  • 只是好奇,有更快的方法吗?

2 个答案:

答案 0 :(得分:2)

第一次查询具有高IO成本和低CPU成本。第二个查询具有低IO和比第一个查询更多的CPU。

我建议使用第二个查询,因为IO对性能的影响要大于CPU。如果你可以减少查询的IO并增加CPU成本,那么可以降低CPU成本并增加IO成本。

答案 1 :(得分:1)

尝试以下两个查询

SELECT PARENT FROM TABLE1
UNION SELECT CHILD FROM Table1

UNION将为您做到与众不同。在子查询中不需要使用DISTINCT。这样,您可以将DISTINCT SORT运算符从2减少到1.它还消除了MERGE JOIN两个子查询的需要。

SELECT DISTINCT Id
FROM 
(
   SELECT PARENT, CHILD
   FROM TABLE1
) AS S
UNPIVOT
(
   Id FOR AccountType IN ([Parent], [Child])
) AS UP

它还会扫描一次表,但不会引入任何新的常量。

以下是我的机器中带有样本数据的查询成本

  • 有疑问的问题1:40%
  • 问题2:23%
  • 我的回答中的查询1:20%
  • 我的回答中的查询2:17%

我无法预测大量数据的查询成本。它可能会改变。尝试使用自己的数据。