postgres hint

某些开关并不是强制执行的 , 例如只有全表扫描这种方法可选的时候 , 即使关闭全表扫描也会走全表扫描 , 但是这种情况下 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) 种组合 .
所以执行计划的开销会随着关联表的数量而指数级的增加
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值