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
| [(hashbucket 分区表的toast索引个数 + LOCAL的LBI个数) * 1024 + LOCAL的CBI索引个数] * 分区数 * 2 + GLOBAL的LBI个数 * 1024 * 2 + GLOBAL的CBI个数 * 2
|
- enable_segment_datafile_preallocate为on时:
| 预占用空间 | hashbucket 表 | hashbucket 分区表 |
|---|---|---|
| heap页面数 | (hashbucket 表个数 + toast表个数)*1024 | (hashbucket 分区表的分区总数 + toast表分区总数)*1024 |
| index页面数 | (hashbucket 表的CBI个数)*9 + (toast索引个数 + hashbucket 表的LBI个数) * 1024 * 9
| [(hashbucket 分区表的toast索引个数 + LOCAL的LBI个数) * 1024 + LOCAL的CBI索引个数] * 分区数 * 9 + GLOBAL的LBI个数 * 1024 * 9+ GLOBAL的CBI个数 * 9
|