PostgreSQL中cpu_index_tuple_cost与cpu_tuple_cost为何数值不同?
为什么PostgreSQL中cpu_index_tuple_cost与cpu_tuple_cost数值存在差异?
这两个参数都是查询优化器用来估算CPU处理开销的,但对应完全不同的处理场景,哪怕数据页已在内存中,两者的实际开销也有明显区别:
- cpu_tuple_cost:估算的是从表的数据页读取完整元组、并执行行级处理(如过滤条件校验、字段投影)的CPU开销。这一步需要解析完整的行结构,处理所有字段,甚至可能涉及类型转换、约束检查等操作,整体CPU消耗更高。
- cpu_index_tuple_cost:估算的是从索引页读取索引元组的CPU开销。索引元组仅包含索引键值和指向数据页的指针,结构远比完整表元组简单,处理时无需解析全量字段,CPU开销自然更低。
官方将这两个参数分开设置,是为了让优化器能精准区分“处理索引条目”和“处理完整表行”这两种场景的CPU消耗。比如在索引扫描场景中,优化器会计算:遍历索引条目的开销(基于cpu_index_tuple_cost) + 回表读取完整元组的开销(基于cpu_tuple_cost),以此来判断索引扫描是否比全表扫描更高效。如果将两者设为相同值,会导致优化器误判开销,进而选择非最优的执行计划。
内容的提问来源于stack exchange,提问作者abc xyz
相关产品推荐
相关产品推荐

