我问了一个question昨天,一个答案让我开始思考性能。
继续,我有一个表示亲子关系的表:
PARENT | CHILD
1 | 2
1 | 3
2 | 4
两个字段都是代表一个人的数字。
我需要把这张表中不同的人组成一组,而不是导入 child 或 parent 。我首先想到的查询是最明显的一个:
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)
我的问题是:
- 这第二个查询真的比我一直构建的第一个查询快吗?
- 出于好奇,有没有更快的方法?
最佳答案
第一个查询比第二个查询具有高 IO 成本和低 CPU 成本。与第一个查询相比,第二个查询具有低 IO 和更多 CPU。
我建议使用第二个查询,因为 IO 对性能的影响比 CPU 更大。如果您可以减少查询的 IO 并增加 CPU 成本,那么减少 CPU 成本并增加 IO 成本会更好。
关于sql - UNION 与 CROSS APPLY 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24924882/