表 K.1描述了PostgreSQL的各种硬性限制。 但是,在达到绝对硬限制之前,可能会先受到现实的限制,例如性能限制或可用磁盘空间。
表 K.1. PostgreSQL限制
| 项目 | 上限值 | 说明 | 
|---|---|---|
| 数据库大小 | 不限 | |
| 数据库数量 | 4,294,950,911 | |
| 每个数据库的关系数量 | 1,431,650,303 | |
| 关系大小 | 32 TB | 基于BLCKSZ为缺省的8192字节 | 
| 每个表的记录数 | 受限于可以放到4,294,967,295个页中的元组数 | |
| 表格每列 | 1,600 | 进一步受限于元组大小适合单个页面;请参见下面的注释 | 
| 结果集中的列 | 1,664 | |
| 字段大小 | 1 GB | |
| 每个表的索引数 | 不限 | 受每个数据库最大关系数的约束 | 
| 每个索引的列数 | 32 | 可以通过重新编译PostgreSQL增大 | 
| 分区键 | 32 | 可以通过重新编译PostgreSQL来增加 | 
| 标识符长度 | 63字节 | 可以通过重新编译PostgreSQL增大 | 
| 函数参数 | 100 | 可以通过重新编译PostgreSQL来增加 | 
| 查询参数 | 65,535 | 
  表的最大列数进一步减少,因为要存储的元组必须适合单个8192字节的堆页。例如,不包括元组头部,
  由1600个int列组成的元组将消耗6400字节,并可以存储在堆页中,但由1600个
  bigint列组成的元组将消耗12800字节,因此无法放入堆页中。
  类型为text、varchar和char的可变长度字段,
  当值足够大时,可以在表的TOAST表中以离线方式存储。在表的堆中,只需保留一个18字节的指针。
  对于较短的可变长度字段,使用4字节或1字节字段头,并将值存储在堆元组内部。
从表中删除的列也会影响最大列限制。此外,尽管在元组的空位图中将新创建的元组的删除列值内部标记为空,但空位图也占用空间。
每个表可以存储理论上最多 2^32 个外部值;详见 第 73.2 节 了解关于外部存储的详细讨论。这个限制 来源于使用 32 位 OID 来标识每个这样的值。实际限制显著低于理论 限制,因为随着 OID 空间的填充,找到一个仍然可用的 OID 可能会变得 昂贵,从而减慢 INSERT/UPDATE 语句的速度。 通常,这仅对包含许多 TB 数据的表是一个问题;分区是一个可能的解决 方法。