From bfaddc3a08ca75acc8023d76768ece4cb09e7585 Mon Sep 17 00:00:00 2001 From: Jakub Wartak Date: Wed, 5 Jul 2023 16:32:37 +0200 Subject: [PATCH v3] doc: Add some OID/TOAST-related limitations to the limits appendix Although https://wiki.postgresql.org/wiki/TOAST#Total_table_size_limit references some OID/TOAST-related limitations, those are not very clear from the official documentation. Put some information into Limits for better transparency. Discussion: https://www.postgresql.org/message-id/flat/CAKZiRmwWhp2yxjqJLwbBjHdfbJBcUmmKMNAZyBjjtpgM9AMatQ%40mail.gmail.com --- doc/src/sgml/limits.sgml | 47 +++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/limits.sgml b/doc/src/sgml/limits.sgml index d5b2b627dd..d92341de3b 100644 --- a/doc/src/sgml/limits.sgml +++ b/doc/src/sgml/limits.sgml @@ -10,6 +10,7 @@ hard limits are reached. + <productname>PostgreSQL</productname> Limitations @@ -52,7 +53,7 @@ rows per table limited by the number of tuples that can fit onto 4,294,967,295 pages - + further limited by the number of TOAST-ed values; see note below @@ -92,11 +93,25 @@ can be increased by recompiling PostgreSQL - - partition keys - 32 - can be increased by recompiling PostgreSQL - + + partition keys + 32 + can be increased by recompiling PostgreSQL + + + + maximum large object size + 4TB + see + + + + large objects size per database + subject to the same limitations as rows per table and relation size + (32 TB by default) + + +
@@ -123,4 +138,24 @@ created tuples are internally marked as null in the tuple's null bitmap, the null bitmap also occupies space. + + + For every TOAST-ed column (that is for columns wider than TOAST_TUPLE_TARGET + [2040 bytes by default]), due to internal PostgreSQL implementation of using one + shared global OID counter - you cannot have more than 4,294,967,296 out-of-line + values in a single table. + + + + In practice, you want to have considerably less than that many TOASTed values + per table, because as the OID space fills up, the system will spend larger + amounts of time searching for the next free OID when it needs to generate a new + out-of-line value. This will eventually cause slowdowns for INSERT, UPDATE, and + COPY statements. + + Only column values wider than TOAST_TUPLE_TARGET will consume TOAST OIDs in this way. + So in practice, reaching this limit would require many terabytes of data in a + single table, especially with large number of wide columns. + + -- 2.30.2