Приложение 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 отделённых значений. Более подробно такие значения описаны в Разделе 69.2. Данное ограничение вызвано использованием 32-битных OID для идентификации каждого такого значения. В реальности же лимит значительно ниже, поскольку как только всё пространство для OID занято, найти свободный OID становится сложно, что замедляет работу операторов INSERT/UPDATE. Обычно это происходит только с таблицами объёмом в несколько терабайт. Возможным обходным решением может быть секционирование.