更新时间:2026-07-28 GMT+08:00
分享

bucket分布表的空间预占用

GUC参数enable_segment_datafile_preallocate控制是否打开段页式文件扩展立即分配磁盘空间模式。该参数为off时,以空洞的方式扩展文件,实际使用的时候才占用磁盘空间;该参数为on时,以预占用的方式扩展文件,文件扩展出来就占用磁盘空间。默认值为on。

  • 磁盘空间较小时建议关闭enable_segment_datafile_preallocate。
  • 关闭enable_segment_datafile_preallocate时,对于全量build或备份恢复场景,数据复制到目标节点后,空洞会被填0,填0后占用磁盘空间,导致目标节点磁盘空间占用大于源节点。

bucket分布表的空间占用包括元数据空间和数据空间,由5个文件组成(1-5)。1号文件为bucket元数据文件,2-5号文件为数据文件。

元数据页面的计算方式请参见设置segment_buffers,数据页面与数据量有关,扩展方式为:

  • 段页式2号文件:

    每次创建CBI索引时,会在段页式 2 号文件为其申请一个 extent(8个页面),不论当前表中是否有数据。如果没有空闲的 extent,则会先拓展段页式文件(扩展步长128MB)然后再分配。

  • bucket 2号文件:

    每次创建 hashbucket 表的LBI索引或toast索引时,会在 2 号文件为其申请一个新的 extent(8个页面),不论当前表中是否有数据。如果没有空闲的 extent,则会先拓展段页式文件(扩展步长8MB)然后再分配。

bucket分布表预占用空间,计算方法如下:

  • enable_segment_datafile_preallocate为off时:

预占用空间

hashbucket 表

hashbucket 分区表

heap页面数

(hashbucket 表个数 + toast表个数)*1024

(hashbucket 分区表的分区总数 + toast表分区总数)*1024

index页面数

(hashbucket 表的CBI个数)*2+ (toast索引个数 + hashbucket表的LBI个数) * 1024 * 2

  • 2:表示1号文件1个页面+2号文件1个页面。
  • 1024:表示bucket总数。

[(hashbucket 分区表的toast索引个数 + LOCAL的LBI个数) * 1024 + LOCAL的CBI索引个数] * 分区数 * 2 + GLOBAL的LBI个数 * 1024 * 2 + GLOBAL的CBI个数 * 2

  • 2:表示1号文件1个页面+2号文件1个页面。
  • 1024:表示bucket总数。
  • enable_segment_datafile_preallocate为on时:

预占用空间

hashbucket 表

hashbucket 分区表

heap页面数

(hashbucket 表个数 + toast表个数)*1024

(hashbucket 分区表的分区总数 + toast表分区总数)*1024

index页面数

(hashbucket 表的CBI个数)*9 + (toast索引个数 + hashbucket 表的LBI个数) * 1024 * 9

  • 9:表示1号文件1个页面+2号文件8个页面。
  • 1024:表示bucket总数。

[(hashbucket 分区表的toast索引个数 + LOCAL的LBI个数) * 1024 + LOCAL的CBI索引个数] * 分区数 * 9 + GLOBAL的LBI个数 * 1024 * 9+ GLOBAL的CBI个数 * 9

  • 9:表示1号文件1个页面+2号文件8个页面。
  • 1024:表示bucket总数。

空间预占用示例

  • 普通表

    假设表包含1个toast索引、1个LBI索引、1个CBI索引。

    • 关闭空间预占用:数据占用空间:2 * 8KB * 1024 = 16MB

      索引占用空间:2 * (8KB + 8KB) * 1024 + (8KB + 8KB) ≈ 32MB

      总共:48MB

    • 打开空间预占用:数据占用空间: 2 * 8KB * 1024 = 16MB

      索引占用空间: 2 * (8KB + 64KB) * 1024 + (8KB + 64KB) ≈ 144MB

      总共:232MB

  • 分区表(每个分区相当于1张普通表)

    假设表包含730个分区,1个主键LOCAL索引、toast表、toast索引、1个LPI+LBI索引、1个LPI+CBI索引、1个GPI+CBI索引、1个GPI+LBI索引。

    • 关闭空间预占用:数据占用空间: 2 * 730 * 8KB * 1024 = 11GB

      索引占用空间: 730 * [ 3* (8KB + 8KB) * 1024 + (8KB + 8KB) ] + (8KB + 8KB) + (8KB + 8KB) * 1024 ≈ 34GB

      总共:45GB

    • 打开空间预占用:数据占用空间: 2 * 730 * 8KB * 1024 = 11GB

      索引占用空间: 730 * [3*(8KB + 64KB) * 1024 + (8KB + 64KB) ] + (8KB + 64KB) + (8KB + 64KB) * 1024 ≈ 154GB

      总共:165GB

相关文档