
# bucket分布表的空间预占用
GUC参数enable_segment_datafile_preallocate控制是否打开段页式文件扩展立即分配磁盘空间模式。该参数为off时，以空洞的方式扩展文件，实际使用的时候才占用磁盘空间；该参数为on时，以预占用的方式扩展文件，文件扩展出来就占用磁盘空间。默认值为on。
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 磁盘空间较小时建议关闭enable_segment_datafile_preallocate。
- 关闭enable_segment_datafile_preallocate时，对于全量build或备份恢复场景，数据复制到目标节点后，空洞会被填0，填0后占用磁盘空间，导致目标节点磁盘空间占用大于源节点。
 
bucket分布表的空间占用包括元数据空间和数据空间，由5个文件组成（1-5）。1号文件为bucket元数据文件，2-5号文件为数据文件。
元数据页面的计算方式请参见[设置segment_buffers](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0773.html)，数据页面与数据量有关，扩展方式为：
- 段页式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
    
   
 
