Redrock Postgres 搜索 英文
版本: 12 / 13 / 14 / 15 / 16 / 17

附录 K. PostgreSQL 限制

表 K.1描述了PostgreSQL的各个硬限制。然而,在达到绝对硬限制之前,实际限制(例如性能限制或可用磁盘空间)可能会生效。

表 K.1. PostgreSQL 限制

条目 上限 注释
数据库大小 无限制  
数据库数量 4,294,950,911  
每个数据库的关系数 1,431,650,303  
关系大小 32 TB 采用默认BLCKSZ为 8192 字节
每个表中的行数 受可以容纳在 4294967295 个页面上的元组数量限制  
每个表中的列数 1,600 进一步受适用于单个页面的元组大小限制;请参见下面的注释
结果集中的列数 1,664  
字段大小 1 GB  
每个表中的索引数 无限制 受每个数据库的最大关系数约束
每个索引中的列数 32 可以通过重新编译PostgreSQL来增加
分区键 32 可以通过重新编译PostgreSQL来增加
标识符长度 63 字节 可以通过重新编译PostgreSQL来增加
函数参数 100 可以通过重新编译PostgreSQL来增加
查询参数 65,535  

由于存储的元组必须放在一个 8192 字节的堆页面中,表的最大列数因而进一步减少。例如,不包括元组报头,一个由 1,600 个 int 列组成的元组将消耗 6400 字节,可以存储在一个堆页面中,但是一个由 1,600 个 bigint 列组成的元组将消耗 12800 字节,因此不适合一个堆页面。当值足够大时,textvarcharchar 等类型的长度可变字段的值可以在表的 TOAST 表中存储于行外。表堆中元组中只需要保留一个 18 字节的指针。对于较短的长度可变字段,可以使用一个 4 字节或 1 字节的字段报头,并且值存储在堆元组中。

从表中删除的列也会影响最大列数限制。此外,尽管新创建元组的已删除列值在元组的 null 位图中在内部标记为 null,但 null 位图也会占用空间。

每个表最多可以在理论上存储 2^32 个行外值;请参见 第 65.2 节,了解有关行外存储的详细讨论。此限制源于使用一个 32 位 OID 来标识每个此类值。由于 OID 空间会填满,找到仍然是空闲的 OID 可能会变得昂贵,继而会减慢 INSERT/UPDATE 语句的速度,因此实际限制明显低于理论限制。通常,这仅适用于包含很多 TB 级数据表的;分区是一种可能的解决方法。