(1) 来自pg文档
PostgreSQL使用的是基于成本的优化器(Cost based optimizer)。理论上基于成本的优化器会计算用户输入的查询语句的每个合法的查询计划的执行成本,然后从中选择成本最小的计划作为执行查询语句的 最终计划。在实际应用中,查询语句的合法的查询计划的个数是随查询复杂度的增加呈指数增长的。对于过于复杂的查询,如果遍历每个合法的查询计划,将会消耗 掉大量的时间,这是不能被用户接受的,所以优化器不会遍历每个合法的查询计划,只会选择一部分查询计划,从中找到执行成本最小的计划。
(2)调整QL查询计划
在oracle中使用hint可以调整SQL的执行计划,
在postgresql可以使用如下的方法进行调整
使用set<option> to off/on;调整查询计划,参数如下:
enable_seqscan是否走全表扫描
enable_hashjoin是否允许走hash连接
enable_nestloop是否允许走nestloop连接
enable_mergejoin是否允许走合并连接
enable_tidscan是否允许走tid扫描(类似oracle中的按rowid访问)
enable_bitmapscan是否允许走bitmap扫描
enable_hashagg是否允许走hash聚集(也就是做group by时)
enable_indexscan是否允许走索引
enable_sort是否允许走排序
constraint_exclusion是否允许走分区
本文转自:http://www.spasvo.com/news/html/20131220102647.html