sql - UNION 与 CROSS APPLY 性能

标签 sql sql-server

我问了一个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/

相关文章:

mysql - SQL JOINING,哪个是最好的连接

sql - 创建/操作索引时的默认 SET 语句?

.net - 在 .net 3.5 框架和 IIS 7.0 中使用 sqlserver session 状态时是否需要序列化属性

php - 字符串 '' 后的非引号

sql-server - 从表中删除 NULL 且具有相同 DATE 的行

sql - Entity Framework Azure SaveChanges - 日期时间,错误一小时

mysql - DISTINCT 是否总是会为相同的 SQL 返回相同顺序的值?

php - 使这个基本搜索功能起作用的帮助不大(Zend Lucene)

sql-server - 我对 SQL Server 批处理很困惑

sql - Pyspark SQL : Keep entries with only null values in pivot table