我能找到的最接近这个问题的是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秒内完成,而第一个在跑了几个小时后就完成了,这让我觉得我的资源超载了。
答案 0 :(得分:1)
唯一一次"选择列表"性能上的差异是指在索引中完全解析查询并且不需要表访问;因此,一般情况下,只选择您需要使用的列,如果您不需要,请远离LOBS。