某些开关并不是强制执行的
,
例如只有全表扫描这种方法可选的时候
,
即使关闭全表扫描也会走全表扫描
,
但是这种情况下
cost
值会不准确
.
enable_seqscan --
全表扫描开关
enable_indexscan --
索引扫描开关
enable_indexonlyscan -- indexonly
索引扫描开关
(
仅扫描索引和
VM,
以及
vm
以外的
heap page)
enable_bitmapscan --
位图扫描开关
(
先扫描索引
,
然后按
ctid
排序扫描
heap)
enable_nestloop --
嵌套循环连接
enable_hashjoin -- hash
连接
enable_mergejoin --
合并连接
enable_material --
物化开关
,
例如嵌套循环的内部表是否采用物化方式减少扫描成本
. (
例子见嵌套循环的例子
)
enable_hashagg -- hash
聚合
enable_sort --
排序
(
例子见合并连接的例子
)
enable_tidscan -- tid
扫描开关
提升子查询关联等级配置参数:
参数
: from_collapse_limit
select * from x,y,
(SELECT * FROM a, b, c WHERE something) ss
ss
子查询提升后
, from list
的长度变成
5,
小于等于
from_collapse_limit=8(default).
因此这个查询会提升子查询关联等级
.
提升关联等级的
好处
:
关联顺序更多
,
可以得到更优的执行计划
(cost
更低的执行计划
).
坏处:
因为子查询提升后
,
关联顺序指数级提升
,
执行计划耗费的时间会更长
,
例如本例将从
9
种顺序提升到
60
种顺序
.
默认的
from_collapse_limit=8(default)
将达到
20160
种关联顺序
.
把
from_collapse_limit
设置为
1,
则相当于关闭了提升子查询关联的功能
.
相当于强制子查询内按照
SQL
写法关联
.
指定表的关联顺序配置参数
join_collapse_limit,
参数
: join_collapse_limit=8 (default)
当
join_collapse_limit=1
时
,
按
SQL
写法进行关联
设置
join_collapse_limit=1
后
,
按照
SQL
写法进行关联
.
执行计划的时间也缩短了
表关联是执行计划最耗时的部分
,
特别是表多的情况下
,
关联顺序指数增长
.
例如
9
个表关联最多有
9*8*7*6*5*4*3 = 181440
种关联顺序
,
如果再乘上连接方法
(nestloop, hashjoin, mergejoin)
和扫描方法
(indexscan, seqscan, indexonlyscan, bitmapscan
等
)
则最多有
181440*(3^(9-
1))*(n^9-1)
种组合
.
所以执行计划的开销会随着关联表的数量而指数级的增加