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

时间:2017-04-27 21:02:23

标签: sql oracle

我能找到的最接近这个问题的是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秒内完成,而第一个在跑了几个小时后就完成了,这让我觉得我的资源超载了。

1 个答案:

答案 0 :(得分:1)

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