Introduction v15

See the release notes for the features added in EDB Postgres Advanced Server 15.

Hard limits

The following table describes various hard limits of PostgreSQL. However, practical limits such as performance limitations or available disk space might apply before absolute hard limits are reached.

ItemUpper limitComment
database sizeunlimited
number of databases4,294,950,911
relations per database1,431,650,303
relation size32 TBwith the default BLCKSZ of 8192 bytes
rows per tablelimited by the number of tuples that can fit onto 4,294,967,295 pages
columns per table1600further limited by tuple size fitting on a single page; see note below
field size1 GB
identifier length63 bytescan be increased by recompiling PostgreSQL
indexes per tableunlimitedconstrained by maximum relations per database
columns per index32can be increased by recompiling PostgreSQL
partition keys32can be increased by recompiling PostgreSQL
Note
  • The maximum number of columns for a table is further reduced as the tuple being stored must fit in a single 8192-byte heap page. For example, excluding the tuple header, a tuple made up of 1600 int columns consumes 6400 bytes and can be stored in a heap page. But a tuple of 1600 bigint columns consumes 12800 bytes and therefore doesn't fit inside a heap page. Variable-length fields of types such as text, varchar, and char can have their values stored out of line in the table's TOAST table when the values are large enough to require it. Only an 18-byte pointer must remain inside the tuple in the table's heap. For shorter length variable-length fields, either a 4-byte or 1-byte field header is used, and the value is stored inside the heap tuple.

  • Columns that were dropped from the table also contribute to the maximum column limit. Moreover, although the dropped column values for newly created tuples are internally marked as null in the tuple's null bitmap, the null bitmap also occupies space.