Table K.1描述了PostgreSQL的各种硬性限制。 但是,在达到绝对的硬性上限之前,往往会先遇到实际限制,例如性能限制或可用磁盘空间。
Table 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 字节,因此无法装入一个堆页。 text、varchar和char等类型的变长字段,当值大到需要这样做时, 其值就可以存储在线外,也就是存放在该表的 TOAST 表中。该表的堆元组内只需保留一个 18 字节的指针。 对于较短的变长字段,则使用 4 字节或 1 字节的字段头,并将值存储在堆元组内部。
从表中删除的列也会计入最大列数限制。此外,尽管新创建的元组中这些已删除列的值会在元组的空值位图中被内部标记为空, 但空值位图本身也会占用空间。
每个表在理论上最多可以存储 2^32 个线外值;关于线外存储的详细讨论见Section 68.2。 这一限制源于使用 32 位 OID 来标识每个此类值。实际限制要显著低于理论限制,因为随着 OID 空间逐渐被占满, 寻找仍然空闲的 OID 的代价会变高,进而拖慢 INSERT/UPDATE 语句。 通常,这只会对包含数 TB 数据的表构成问题;分区是一种可能的变通办法。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。