昨天我问了一个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)
我的问题是:
答案 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
它还会扫描一次表,但不会引入任何新的常量。
以下是我的机器中带有样本数据的查询成本
我无法预测大量数据的查询成本。它可能会改变。尝试使用自己的数据。