【发布时间】:2015-05-11 06:58:50
【问题描述】:
假设我有三张桌子,
foo (id serial, one text, two text, three text, four text);
bar (id serial, ...)
foobar (foo_id, bar_id)
imagine foo 有四个以上的文本列和数百万行。 而 foobar 只有几个条目,只有 foo_id 等于 5
是
SELECT *
FROM foo f
JOIN foobar fb ON (fb.foo_id = f.id)
JOIN bar b ON (fb.bar_id = b.id)
WHERE foo_id = 5;
要优化吗? WHERE 子句会在所有表都被 JOINed 之后执行吗?还是 WHERE 会很聪明,只选择 JOIN 子句之前的行?
如果是前者..我不应该写
SELECT *
FROM (SELECT * FROM foobar WHERE foo_id=5) fb
JOIN foo f ON (fb.foo_id = f.id)
JOIN bar b ON (fb.bar_id = b.id);
?加快进程?
【问题讨论】:
-
它将优化您的查询。你可以随时使用
ANALYZE看看会发生什么 -
唯一可能的答案是“取决于”,它取决于很多因素。
-
一般规则:使用 SQL,你告诉系统你想要什么,而不是如何去做。 optimizer 的工作是(尝试)找出产生结果的最佳方法。
-
可能值得一读this article on "Which is faster?" questions。值得我使用您的演示模式来设置两个查询的SQL Fiddle to compare the execution plans,它们是相同的。
-
检查执行计划。 @Adassko:你的意思是
explain analyze,analyze本身不会显示执行计划。
标签: sql performance postgresql optimization