Приложение L. Ограничения Postgres Pro
В Таблице L.1 описываются различные жёсткие ограничения Postgres Pro. Однако раньше этих абсолютных лимитов на практике могут достигаться другие, например, предел производительности или доступного объёма дискового хранилища.
Таблица L.1. Ограничения Postgres Pro
Объект | Верхний предел | Комментарий |
---|---|---|
размер базы данных | без ограничений | |
количество баз данных | 4 294 950 911 | |
отношений в базе данных | 1 431 650 303 | |
размер отношения | 32 ТБ | со значением BLCKSZ по умолчанию, равным 8192 байта |
строк в таблице | ограничивается количеством кортежей, которое может уместиться в 4 294 967 295 страниц | |
столбцов в таблице | 1600 | дополнительно ограничивается размером кортежа, который может уместиться в одной странице; см. примечание ниже |
столбцов в наборе результатов | 1664 | |
размер поля | 1 ГБ | |
индексов в таблице | без ограничений | ограничивается максимальным количеством отношений в базе данных |
столбцов в индексе | 32 | может быть увеличена при перекомпиляции Postgres Pro |
ключей секционирования | 32 | может быть увеличена при перекомпиляции Postgres Pro |
длина идентификатора | 63 байта | может быть увеличена при перекомпиляции Postgres Pro |
аргументы функции | 100 | может быть увеличена при перекомпиляции Postgres Pro |
параметры запроса | 65535 |
Максимальное количество столбцов таблицы дополнительно уменьшается в связи с тем, что сохраняемый кортеж должен умещаться в одной странице размером 8192 байта. Например, если не учитывать размер заголовка, кортеж, состоящий из 1600 столбцов int
, будет занимать 6400 байт и поместится в странице кучи, тогда как 1600 столбцов bigint
займут 12800 байт и в одной странице не поместятся. Поля переменной длины, например типов text
, varchar
и char
, могут храниться отдельно, в таблице TOAST, когда их значения достаточно велики для этого. При этом внутри кортежа кучи должен остаться только 18-байтовый указатель. Для более коротких значений полей переменной длины используется заголовок из 1 или 4 байт, и само значение сохраняется внутри кортежа в куче.
Максимальное количество столбцов может также зависеть от числа столбцов, удалённых из таблицы. И хотя значения удалённых столбцов для создаваемых впоследствии кортежей не хранятся, а только помечаются как NULL в специальной битовой карте, эта карта тоже занимает место.
Теоретически каждая таблица может хранить до 2^32 отделённых значений. Более подробно такие значения описаны в Разделе 66.2. Данное ограничение вызвано использованием 32-битных OID для идентификации каждого такого значения. В реальности же лимит значительно ниже, поскольку как только всё пространство для OID занято, найти свободный OID становится сложно, что замедляет работу операторов INSERT/UPDATE. Обычно это происходит только с таблицами объёмом в несколько терабайт. Возможным обходным решением может быть секционирование.
Appendix L. Postgres Pro Limits
Table L.1 describes various hard limits of Postgres Pro. However, practical limits, such as performance limitations or available disk space may apply before absolute hard limits are reached.
Table L.1. Postgres Pro Limitations
Item | Upper Limit | Comment |
---|---|---|
database size | unlimited | |
number of databases | 4,294,950,911 | |
relations per database | 1,431,650,303 | |
relation size | 32 TB | with the default BLCKSZ of 8192 bytes |
rows per table | limited by the number of tuples that can fit onto 4,294,967,295 pages | |
columns per table | 1,600 | further limited by tuple size fitting on a single page; see note below |
columns in a result set | 1,664 | |
field size | 1 GB | |
indexes per table | unlimited | constrained by maximum relations per database |
columns per index | 32 | can be increased by recompiling Postgres Pro |
partition keys | 32 | can be increased by recompiling Postgres Pro |
identifier length | 63 bytes | can be increased by recompiling Postgres Pro |
function arguments | 100 | can be increased by recompiling Postgres Pro |
query parameters | 65,535 |
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 1,600 int
columns would consume 6400 bytes and could be stored in a heap page, but a tuple of 1,600 bigint
columns would consume 12800 bytes and would therefore not 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 have been 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.
Each table can store a theoretical maximum of 2^32 out-of-line values; see Section 66.2 for a detailed discussion of out-of-line storage. This limit arises from the use of a 32-bit OID to identify each such value. The practical limit is significantly less than the theoretical limit, because as the OID space fills up, finding an OID that is still free can become expensive, in turn slowing down INSERT/UPDATE statements. Typically, this is only an issue for tables containing many terabytes of data; partitioning is a possible workaround.