PostgreSQL pageinspect扩展bt_page_stats的avg_item_size含义及差异疑问
B树索引
avg_item_size差异问题解答 1. bt_page_stats中avg_item_size的定义
该指标是pageinspect扩展针对PostgreSQL B树索引页的统计值,含义是当前索引页内所有索引条目的平均字节长度,计算逻辑为索引页内所有索引项的总占用字节数除以索引项总数量。
2. integer类型索引avg_item_size大于text类型的原因
这是PostgreSQL 12及以上版本默认开启的*B树索引去重(deduplication)*优化导致的:
- 当某个索引键值存在大量重复行时,PostgreSQL不会为每一行都生成独立的「索引键+单个
TID(6字节行标识符)」索引项,而是将相同键值对应的所有TID整合成一个posting list,合并为单个索引项存储,大幅降低整体索引的空间占用。 - 你观察到的长度为808的索引项,就是合并了数百个
TID的posting list项,单条长度远大于普通独立索引项,拉高了平均长度。
3. 关于TID存在性的疑问
不存在「integer索引有TID、text索引没有TID」的情况,所有B树索引的有效条目都会存储对应行的TID:
- 你的text字段索引基数(去重后值的数量)极高,几乎没有重复的索引键,不会触发去重合并,所有索引项都是「text值+单个
TID」的独立结构,因此你看不到批量存储的TID列表,单条索引项长度更小,最终平均长度反而低于存在大量合并项的integer索引。
内容的提问来源于stack exchange,提问作者Ivan Kamas
相关产品推荐
相关产品推荐

