一般来说,FROM子句中表的排列或顺序是否会在提高查询性能方面有所作为?通过安排我的意思是最小的桌子和最大的桌子。
也欢迎任何不同的经验/想法/意见/因素。
就我而言,我们使用的是PostgreSQL v8.2.3。
答案 0 :(得分:4)
对于内部连接,它应该没有任何区别 - 优化器将生成计划以尽可能多的不同顺序进行连接(直到中的geqo_threshold表来自子句。
外连接不是对称的,因此语句中的顺序很重要(尽管实际的执行顺序仍由服务器决定)。
答案 1 :(得分:2)
您使用的是“SELECT FROM table1,table2”吗? 这些表是“隐式”交叉连接的,所以我认为这不重要。
我要做的第一件事是使用EXPLAIN测试两个可能的查询,看看是否有任何区别?
答案 2 :(得分:0)
(通用SQL建议,而不是Postgre特定的)
它不应该有所作为 - 优化器应该根据它可用的信息构建一个计划,而SQL通常被设计为优化器可以自由重新排序连接,条件检查等,只要结果相同。
特定查询可能会导致特定优化器出现问题(对于某个数据库,服务器状态,产品版本等),但遇到这种情况应该很少见。
答案 3 :(得分:0)
如果你写FROM foo, bar, baz
然后没有,它没有什么区别。如果您编写FROM foo JOIN bar ... JOIN baz ...
(内部联接),那么如果您的join_collapse_limit
元素少于{{3}},那么它就没有区别;否则,连接顺序是固定的,您可以使用它来手动优化这些事情(但很少需要)。对于外连接,连接顺序在写入时是固定的,因为这会影响结果。