join控制规划器

163 阅读1分钟

在连接查询里,如

SELECT * FROM a,b,c
WHERE a.id=b.id AND b.ref=c.id;

生成的查询计划可以先连接A和B,再把C连接到这个表上,或者也可以先连接B和C然后再连接A。这些连接方式语义相同,但在执行方式上可能有巨大差别。因此,规划器(planner)会对它们进行检查并找出最高效的查询计划。

潜在的连接顺序的数目随着表的数量增加。当超过十个表以后,实际上根本不可能对所有连接顺序穷举。如果输入太多表,PostgreSQL规划器将从穷举搜索切换为基因概率搜索(genetic probabilistic search)以减少样本空间。基因概率搜索画的时间少,但是并不一定能找到最好的规划。

大多数JOIN不完全强迫连接顺序,但仍然可以明确告诉PostgreSQL规划器JOIN子句的连接顺序。

可以通过设置参数join_collapse_limit 为1,强制规划器遵循sql语句中的JOIN连接顺序。对于上面的sql语句,如果设置join_collapse_limit=1,相当于强迫规划器先连接a和b,再连接c。