支持的版本:当前 (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 字节的堆页面,因此表的列最大数量会进一步减少。例如,排除元组头,由 1600 个 int 列组成的元组将占用 6400 字节,可以存储在堆页面中,但由 1600 个 bigint 列组成的元组将占用 12800 字节,因此不适合存储在堆页面中。当值足够大以至于需要时,诸如 textvarcharchar 等类型的可变长度字段的值可以存储在表的 TOAST 表之外。只有 18 字节的指针必须保留在表堆中的元组内部。对于较短的可变长度字段,使用 4 字节或 1 字节的字段头,并将值存储在堆元组内。

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

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

提交更正

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