当前位置: 首页 > 面试题库 >

UNION与CROSS APPLY的表现

孟安民
2023-03-14
问题内容

继续,我有一个表代表一个父母身份的关系:

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)

我的问题是:

  • 第二个查询真的比我一直建立的第一个查询快吗?
  • 只是出于好奇,有没有更快的方法呢?

问题答案:

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

我建议使用第二个查询,因为IO对性能的影响比对CPU的影响更大。如果您可以减少查询的IO并增加CPU成本,则最好减少CPU成本并增加IO成本。



 类似资料:
  • 问题内容: 我是SQL,PDO和PHP的新手,所以我知道很多人在问自己。还是没什么冒险的……我想结合两个查询的结果,并使用别名使UNION查询的列名相同。我尝试了各种减少操作,直到没有减少的余地为止,我的应用程序需要的实际结果还有很多。我有以下代码,无法考虑为什么它不起作用。 这两个查询都是独立工作的,但是当我将它们与UNION结合使用时,我什么也没得到。任何建议将是最有帮助的。 非常感谢您的期待

  • Apache Commons Collections库的CollectionUtils类为常见操作提供了各种实用方法,涵盖了广泛的用例。 它有助于避免编写样板代码。 这个库在jdk 8之前非常有用,因为Java 8的Stream API现在提供了类似的功能。 检查工会 CollectionUtils的union()方法可用于获取两个集合的并集。 声明 (Declaration) 以下是声明 org

  • 返回一个输入集合并的集合 语法 (Syntax) 以下是语法。 (union set1 set2) Parameters - 'set1'是第一组元素。 'set2'是第二组元素。 Return Value - 连接的元素集。 例子 (Example) 以下是Clojure中的联合示例。 (ns clojure.examples.example (:require [clojure.set

  • Creates a new sequence with all the unique elements either in this sequence or among the specified arguments. Signature Sequence.union = function(var_args) { /*...*/ } Sequence.union = function union(

  • UNION操作用于合并两个或多个 SELECT 语句的结果集。 使用示例: Db::field('name') ->table('think_user_0') ->union('SELECT name FROM think_user_1') ->union('SELECT name FROM think_user_2') ->select(); 闭包用法: Db::

  • A union is a type of object that can represent one of many kinds of objects. For example, a field marked as a ReactableUnion could be a CommitComment, an Issue, an IssueComment, or a PullRequestReview