PostgreSQL 数据库存在一些大小和数量的硬性限制。
不过,这些限制通常足够大,因此实际情况往往是系统性能、磁盘空间首先出现问题。
项目 | 上限 | 备注 |
---|---|---|
数据库大小 | 无限制 | |
数据库数量 | 4,294,950,911 | |
每个数据库中的关系数量 | 1,431,650,303 | |
关系大小 | 32 TB | BLCKSZ 使用默认 8192 字节 |
每个表中的行数 | 取决于 4,294,967,295 个数据页存储的元组数量 | |
每个表中的列数 | 1600 | 进一步受到单个数据页大小的限制,参见下文 |
单个结果集中列数 | 1664 | |
字段大小 | 1 GB | |
标识符长度 | 63 字节 | 重新编译 PostgreSQL 可以调整大小 |
每个表中的索引数量 | 无限制 | 受到每个数据库中的关系数量限制 |
每个索引中的列数 | 32 | 重新编译 PostgreSQL 可以调整大小 |
分区键 | 32 | 重新编译 PostgreSQL 可以调整大小 |
备注:关系包括表、序列、视图、外部表、物化视图、复合类型以及索引。
每个表中支持的最大列数还需要单个数据页(8192 字节)的限制,因为单个元组必须存储在同一个数据页中。例如,去掉元组头部之外,一个由 1600 个 int 字段组成的元组需要 6400 字节,可以存储在一个数据页中。但是一个由 1600 个 bigint 字段组成的元组需要 12800 字节,无法使用单个数据页存储。
变长字段,例如 text、varchar、char,长度超过一定的阈值时可以使用 TOAST 技术存储在行外。此时数据页中只存储一个 18 字节的指针。对于阈值之内的变长字段,元组包含一个 4字节或者 1 字节的字段头部以及数据。
另外,表中已经删除的字段,也会计算到字段限制中。而且,已删除的字段在插入数据时,在元组的空值位图中标记为 null,空值位图也需要占用空间。