PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

Appendix K. PostgreSQL 限制与配额

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)进行水平切分。