Каков предел размера таблицы TOAST в PostgreSQL? 4 миллиарда строк или 4 миллиарда значений chunk_id? - PullRequest
3 голосов
/ 20 марта 2020

в вики для PostgreSQL, относящихся к таблицам TOASTed (https://wiki.postgresql.org/wiki/TOAST), говорит:

"Вы не можете иметь более 2 ^ 32 (4 миллиардов) из строковых значений в одной таблице, поскольку в ее таблице TOAST должны быть дублированные OID. "

Что это значит?

1) таблица TOAST не может иметь более 4 миллиардов строки? или

2) таблица TOAST не может иметь более 4 миллиардов различных значений OID (значений для столбца chunk_id)?

У нас есть таблица с 3,2 миллиардами строк, и мы задаемся вопросом, близки ли мы до предела.

Заранее спасибо

1 Ответ

3 голосов
/ 20 марта 2020

Таблицы TOAST определяются следующим образом:

\d pg_toast.pg_toast_59238
TOAST table "pg_toast.pg_toast_59238"
   Column   |  Type   
------------+---------
 chunk_id   | oid
 chunk_seq  | integer
 chunk_data | bytea

Здесь chunk_id - это идентификатор отдельного значения в тосте, а chunk_seq - индекс для частей, на которые было разбито значение в тосте. .

Поскольку существует только около 4 миллиардов различных беззнаковых 4-байтовых целых чисел, и это тип данных oid, в каждой таблице базы данных может быть только 4 миллиарда данных с тостами.

Однако не каждая запись в таблице подвергается тосту: только когда размер строки таблицы превышает 2000 байтов после сжатия, значения сохраняются вне строки.

Вы можете пополнить таблицу TOAST для своей таблицы:

SELECT reltoastrelid
FROM pg_class
WHERE relname = 'mytable';

Затем вы можете узнать, сколько там записей:

SELECT count(DISTINCT chunk_id)
FROM pg_toast.pg_toast_12345;

Предупреждение: Это дорогостоящий запрос.

...