PostgreSQL索引扫描启动成本公式中系数50的含义问询
PostgreSQL索引扫描启动成本公式中系数50的说明
背景
针对查询语句 SELECT id, data FROM tbl WHERE data < 240;,结合索引tbl_data_idx的元组数10000、索引树高度H_index=1,使用默认cpu_operator_cost=0.0025代入索引扫描启动成本公式:
start_up cost= {ceil(log₂(N_index_tuple)) + (H_index + 1) × 50} ×cpu_operator_cost
计算结果0.285与EXPLAIN输出的0.29一致,这里的疑问是公式中的系数50是什么,是否为统计意义的启发式数值。
解答
- 系数50的本质:这是PostgreSQL优化器中固定的启发式经验系数,并非基于实际统计数据计算得到的数值。
- 作用:它用于量化索引扫描启动阶段,遍历索引树路径(从根节点到目标叶节点)时,每个层级节点的CPU操作开销——包括节点内元组的查找、比较等基础操作的成本权重。
- 源码对应逻辑:在
src/backend/optimizer/path/costsize.c的相关代码段中,该系数被用来将索引树层级的遍历操作转化为可计算的CPU成本值,帮助优化器对比不同执行路径的开销,最终选择最优计划。
内容的提问来源于stack exchange,提问作者rrrokhtar
相关产品推荐
相关产品推荐

