在不选择所需列的情况下加入表或加入表中列的子选择是不是更有效

Posted

技术标签:

【中文标题】在不选择所需列的情况下加入表或加入表中列的子选择是不是更有效【英文标题】:Is it more efficient to join a table without selecting the columns you want, or to join on a subselection of columns from a table在不选择所需列的情况下加入表或加入表中列的子选择是否更有效 【发布时间】:2017-04-27 21:02:23 【问题描述】:

我能找到的最接近这个问题的是this one,但这并不是我想要的,因为他们的例子似乎会显着减少他们的选择(将一张桌子减少到只有具有指定 ID 的那些) 而我的示例将涉及数百万行。

假设表 a 和表 b 都有 50 列和 100 万行以上。

这样做会不会更有效率:

SELECT 
    a.person, 
    cats, 
    dogs, 
    birds, 
    gerbils
FROM a
LEFT JOIN b
ON a.person = b.person

或者这样做更好:

SELECT 
    a1.person, 
    cats, 
    dogs, 
    birds, 
    gerbils
FROM 
(
    SELECT
        person,
        cats,
        dogs
    FROM
        a
) a1
LEFT JOIN 
(
    SELECT
        person,
        birds,
        gerbils
    FROM
        b
) b1
ON a.person = b.person

我的直觉告诉我,第二个可能更糟,因为它似乎会试图在内存中保存比第一个更多的数据。我假设第一个查询只在内存中准确地保存它所连接的内容,而第二个查询可能保存数百万行数据,这些数据被细分到指定的列。我这样想对吗?

编辑:感谢大家的回复,我花了一段时间来测试这个,因为我的实际查询非常广泛,我找不到一个小错误。第一个肯定更有效率。它在 30 秒内完成,而第一个在运行数小时后无法完成,这让我觉得我正在超载资源。

【问题讨论】:

我所知道的大多数查询优化器都不会在意您采用哪种方式。您是否关注特定的 RDBMS?如果是,请标记它。 先猜,没关系,因为 SqlZim 说的。第二个猜测,第一个会表现得更好,无论如何,第一个会表现得更差。但是,当然,唯一确定的方法是自己进行基准测试。不要忘记发布您的发现。 【参考方案1】:

“选择列表”唯一在性能上产生差异的情况是查询可以在索引中完全解析并且不需要表访问;因此,一般来说,只选择您需要使用的列,如果不需要,请远离 LOBS。

【讨论】:

是的,但这并不能回答所提出的实际问题。 OP 想知道查询子查询与直接查询表时是否存在性能差异。 我认为你在分裂头发。 OP 意图归结为通过更改选择列表是否存在性能差异。

以上是关于在不选择所需列的情况下加入表或加入表中列的子选择是不是更有效的主要内容,如果未能解决你的问题,请参考以下文章

Mysql:过滤表依赖于不同表中列的子字符串

雪花数据库:想要使用表中列的值作为另一个表的选择语句中的列名

选择列的最大值时加入表

Toad 问题:Oracle 类型作为显示所有记录的表中列的数据类型

MySQL在不使用表列的情况下选择两列之间的范围日期

如何在不知道列类型的情况下获取列的值