表 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 字节的字段头,并将值存储在堆元组内。
从表中删除的列也会影响最大列数限制。此外,尽管新创建的元组的已删除列值在元组的空位图中内部标记为空,但空位图也占用空间。
每个表可以理论上存储最多 2^32 个行外值;有关行外存储的详细讨论,请参见 第 65.2 节。此限制源于使用 32 位 OID 来标识每个此类值。实际限制远小于理论限制,因为随着 OID 空间的填满,找到仍然可用的 OID 会变得很昂贵,进而降低 INSERT/UPDATE 语句的速度。通常,这仅对包含许多 TB 数据的表而言是一个问题;分区是一种可能的解决方法。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。