2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12

附录 K. PostgreSQL 限制

表 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 字节的堆页面。例如,排除元组头,一个由 1,600 列 int 组成的元组会占用 6400 字节,可以存储在堆页面中,但一个由 1,600 列 bigint 组成的元组会占用 12800 字节,因此无法放入堆页面。像 textvarcharchar 这样的类型中的可变长度字段,当其值足够大时,其值可以存储在表的 TOAST 表中。在表堆中的元组内只需要保留一个 18 字节的指针。对于较短的可变长度字段,可以使用 4 字节或 1 字节的字段头,并且该值存储在堆元组内。

从表中删除的列也会计入最大列数限制。此外,虽然为新创建的元组删除的列值在元组的 NULL 位图中被内部标记为 NULL,但 NULL 位图也占用空间。

每张表理论上最多可以存储 2^32 个“离线”值;有关离线存储的详细讨论,请参见 第 66.2 节。此限制源于使用 32 位 OID 来标识每个这样的值。实际限制远小于理论限制,因为随着 OID 空间的填满,找到一个仍然可用的 OID 可能会变得昂贵,进而减慢 INSERT/UPDATE 语句的速度。通常,这只会在包含大量数据的表中成为问题;分区是一种可能的解决方法。

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的实际体验不符的内容或需要进一步说明的内容,请使用 此表格 报告文档问题。