表 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 字节,因此不适合一个堆页面。当值足够大时,text
、varchar
和 char
等类型的长度可变字段的值可以在表的 TOAST 表中存储于行外。表堆中元组中只需要保留一个 18 字节的指针。对于较短的长度可变字段,可以使用一个 4 字节或 1 字节的字段报头,并且值存储在堆元组中。
从表中删除的列也会影响最大列数限制。此外,尽管新创建元组的已删除列值在元组的 null 位图中在内部标记为 null,但 null 位图也会占用空间。
每个表最多可以在理论上存储 2^32 个行外值;请参见 第 65.2 节,了解有关行外存储的详细讨论。此限制源于使用一个 32 位 OID 来标识每个此类值。由于 OID 空间会填满,找到仍然是空闲的 OID 可能会变得昂贵,继而会减慢 INSERT/UPDATE 语句的速度,因此实际限制明显低于理论限制。通常,这仅适用于包含很多 TB 级数据表的;分区是一种可能的解决方法。