Table K.1 列出了 PostgreSQL 的各项核心物理硬件与架构上限配额。然而在触及这些绝对硬性指标之前,实际生产运行通常更早受制于物理可用磁盘空间或系统整体性能负载。
Table K.1. PostgreSQL 规格配额限制表
| 条目 | 上限配额 | 说明 |
|---|---|---|
| 数据库尺寸 | 无物理限制 | 受限于操作系统文件系统容量与磁盘可用空间 |
| 数据库数量上限 | 4,294,950,911 | 受 32 位 OID 计数器约束 |
| 每个数据库的关系对象上限 | 1,431,650,303 | 包括数据表、索引及视图等各类关系 |
| 单张表物理尺寸上限 | 32 TB | 在默认 8192 字节(8KB)数据块尺寸下的上限 |
| 每张表的数据行数上限 | 受限于 4,294,967,295 个物理数据页能容纳的元组数 | 实际约为数十万亿行 |
| 每张表的字段列数上限 | 1,600 | 实际还受限于元组必须能放入单一 8KB 堆页面;详见下方说明 |
| 查询结果集列数上限 | 1,664 | |
| 单个字段物理存储尺寸上限 | 1 GB | 基于 TOAST 机制的最大物理切片压缩上限 |
| 每张表的索引数量上限 | 无物理限制 | 受限于单个库中的最大关系对象总数 |
| 复合索引最大列数 | 32 | 可通过重新编译 PostgreSQL 调大该常量 |
| 分区键最大列数 | 32 | 可通过重新编译内核进行扩展 |
| SQL 标识符最大字节长度 | 63 字节 | 由 NAMEDATALEN 宏决定(默认 64 字节含结尾 NUL) |
| 函数参数最大数量 | 100 | 可通过重新编译系统调大该上限 |
| 预备语句查询参数上限 | 65,535 | 受前端/后端通信协议的 16 位整型参数计数约束 |
数据表实际所能容纳的最大列数往往进一步受物理约束影响,因为单行数据元组必须能够装入单个 8192 字节的堆数据块中。例如,排除行头开销后,一个由 1,600 个 int 整型列构成的元组约占用 6400 字节,可完全存放于一个堆页面中;但若由 1,600 个 bigint 构成则需占用 12800 字节,因而无法直接塞入单页中。变长字段(如 text、varchar、bytea)在数值较大时会自动触发系统 TOAST 机制,转存到附属的 TOAST 辅助表中,原元组仅保留一个 18 字节的指针引用。对于较短的变长字符串,则使用 1 字节或 4 字节紧凑行头直接内联保存在堆元组中。
从数据表中通过 ALTER TABLE ... DROP COLUMN 删除的废弃列同样会继续占用最大列数配额。此外,新插入的行虽然在底层将已删除列在 NULL 位图中标记为空,但 NULL 位图本身仍按历史总列数分配物理字节。
单张数据表理论上最多可存储 2^32 个行外 TOAST 独立分片(详见 Section 66.2)。实际生产环境建议在单表达到数十 TB 规模时使用表分区(Partitioning)进行水平切分。