Приложение K. Ограничения PostgreSQL

В Таблице K.1 описываются различные жёсткие ограничения PostgreSQL. Однако раньше этих абсолютных лимитов на практике могут достигаться другие, например, предел производительности или доступного объёма дискового хранилища.

Таблица K.1. Ограничения PostgreSQL

ОбъектВерхний пределКомментарий
размер базы данныхбез ограничений 
количество баз данных4 294 950 911 
отношений в базе данных1 431 650 303 
размер отношения32 ТБсо значением BLCKSZ по умолчанию, равным 8192 байта
строк в таблицеограничивается количеством кортежей, которое может уместиться в 4 294 967 295 страниц 
столбцов в таблице1600дополнительно ограничивается размером кортежа, который может уместиться в одной странице; см. примечание ниже
столбцов в наборе результатов1664 
размер поля1 ГБ 
индексов в таблицебез ограниченийограничивается максимальным количеством отношений в базе данных
столбцов в индексе32может быть увеличена при перекомпиляции PostgreSQL
ключей секционирования32может быть увеличена при перекомпиляции PostgreSQL
длина идентификатора63 байтаможет быть увеличена при перекомпиляции PostgreSQL
аргументы функции100может быть увеличена при перекомпиляции PostgreSQL
параметры запроса65535 

Максимальное количество столбцов таблицы дополнительно уменьшается в связи с тем, что сохраняемый кортеж должен умещаться в одной странице размером 8192 байта. Например, если не учитывать размер заголовка, кортеж, состоящий из 1600 столбцов int, будет занимать 6400 байт и поместится в странице кучи, тогда как 1600 столбцов bigint займут 12800 байт и в одной странице не поместятся. Поля переменной длины, например типов text, varchar и char, могут храниться отдельно, в таблице TOAST, когда их значения достаточно велики для этого. При этом внутри кортежа кучи должен остаться только 18-байтовый указатель. Для более коротких значений полей переменной длины используется заголовок из 1 или 4 байт, и само значение сохраняется внутри кортежа в куче.

Максимальное количество столбцов может также зависеть от числа столбцов, удалённых из таблицы. И хотя значения удалённых столбцов для создаваемых впоследствии кортежей не хранятся, а только помечаются как NULL в специальной битовой карте, эта карта тоже занимает место.

Теоретически каждая таблица может хранить до 2^32 отделённых значений. Более подробно такие значения описаны в Разделе 70.2. Данное ограничение вызвано использованием 32-битных OID для идентификации каждого такого значения. В реальности же лимит значительно ниже, поскольку как только всё пространство для OID занято, найти свободный OID становится сложно, что замедляет работу операторов INSERT/UPDATE. Обычно это происходит только с таблицами объёмом в несколько терабайт. Возможным обходным решением может быть секционирование.