gpt4 book ai didi

sql - UNION前后join的查询性能

转载 作者:行者123 更新时间:2023-12-03 02:36:53 25 4
gpt4 key购买 nike

假设我们有一个查询,本质上是使用联合将 2 个记录集合并为 1 个。现在,我需要通过通常使用联接的方式复制记录。出于性能原因,我认为选项 1 是最佳选择,但想知道 SQL 查询专家的想法。

基本上,我“知道”答案是“1”。但是,我也想知道,我会不会错了——我是否可能遗漏了这一点?

(SQL 服务器)这是我的选择。

伪代码

原始查询:

Select Name, Category from t1
Union
Select Name, Category from t2

选项 1)

Select Name, Category from t1
Inner Join (here)
Union
Select Name, Category from t2
Same inner Join (here)

选项 2)

Select * from (
Select Name, Category from t1
Union
Select Name, Category from t2
) t
(Inner Join Here)

最佳答案

SELECT  Name, Category
FROM t1
JOIN t_right
ON right_category = category
UNION
SELECT Name, Category
FROM t2
JOIN t_right
ON right_category = category

SELECT *
FROM (
SELECT Name, Category
FROM t1
UNION
SELECT Name, Category
FROM t2
) t
JOIN t_right
ON right_category = category

这些查询并不相同:如果右表中有两条以上的记录满足连接条件,第二个查询可能会返回重复项,如下所示:

t1

Name Category
--- ---
Apple 1


t2

Name Category
--- ---
Apple 1

t_right

Category
---
1
1

第一个查询将返回 Apple, 1 一次,第二个查询将返回两次。

就性能而言,在我们看到您的数据之前很难判断哪个查询会更有效:

  • 第一个选项可以通过对每个查询应用不同的算法来提高效率。

  • 第二个选项只需读取一次右表即可提高效率。

作为一个非常粗略的经验法则,如果连接条件在 t1t2 上有选择性,第一个选项会更有效,而第二个选项会更有效如果不是,则有效。

但是,在简单情况下(可控制条件上的连接,具有很少的高基数值)SQL Server 的优化器会将连接推出子查询,以便它与以下查询:

SELECT  Name, Category
FROM t_right
CROSS APPLY
(
SELECT Name, Category
FROM t1
WHERE t1.Category = t_right.category
UNION
SELECT Name, Category
FROM t2
WHERE t2.Category = t_right.category
) t

关于sql - UNION前后join的查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1637370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com