表 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 字节的堆页面。例如,排除元组头,一个由 1,600 列 int
组成的元组会占用 6400 字节,可以存储在堆页面中,但一个由 1,600 列 bigint
组成的元组会占用 12800 字节,因此无法放入堆页面。像 text
、varchar
和 char
这样的类型中的可变长度字段,当其值足够大时,其值可以存储在表的 TOAST 表中。在表堆中的元组内只需要保留一个 18 字节的指针。对于较短的可变长度字段,可以使用 4 字节或 1 字节的字段头,并且该值存储在堆元组内。
从表中删除的列也会计入最大列数限制。此外,虽然为新创建的元组删除的列值在元组的 NULL 位图中被内部标记为 NULL,但 NULL 位图也占用空间。
每张表理论上最多可以存储 2^32 个“离线”值;有关离线存储的详细讨论,请参见 第 66.2 节。此限制源于使用 32 位 OID 来标识每个这样的值。实际限制远小于理论限制,因为随着 OID 空间的填满,找到一个仍然可用的 OID 可能会变得昂贵,进而减慢 INSERT/UPDATE 语句的速度。通常,这只会在包含大量数据的表中成为问题;分区是一种可能的解决方法。
如果您在文档中发现任何不正确的内容、与您对特定功能的实际体验不符的内容或需要进一步说明的内容,请使用 此表格 报告文档问题。