表 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 字节,因此不适合堆页。当值足够大时,类型为 text
、varchar
和 char
等的可变长度字段的值可以存储在表的 TOAST 表中。在表堆中的元组内必须保留一个 18 字节指针。对于较短的可变长度字段,使用 4 字节或 1 字节字段头,并将值存储在堆元组中。
从表中删除的列也会影响最大列数限制。此外,尽管新创建的元组的已删除列值在元组的空位图中内部标记为 null,但空位图也会占用空间。