Каков размер метаданных в таблице postgres? - PullRequest
1 голос
/ 29 января 2020

В postgres 9.4 есть таблица со следующими типами столбцов:

 NAME                         TYPE                       TYPE SIZE
 id                         | integer                  | 4 bytes
 timestamp                  | timestamp with time zone | 8 bytes 
 num_seconds                | double precision         | 8 bytes
 count                      | integer                  | 4 bytes
 total                      | double precision         | 8 bytes
 min                        | double precision         | 8 bytes
 max                        | double precision         | 8 bytes
 local_counter              | integer                  | 4 bytes
 global_counter             | integer                  | 4 bytes                                                                     
 discrete_value             | integer                  | 4 bytes

Всего выдачи: 60 bytes per row

Размер возвращаемой таблицы (с тостом) по pg_table_size(table) равно: 49 152 bytes
Количество строк в таблице: 97

Учитывая, что таблица разбита на страницы по 8kB, мы можем вписать 49 152/8 192 = 6 pages в эта таблица.

Каждая страница и каждая строка содержат некоторые метаданные ... Глядя на чистый размер типа данных, мы должны ожидать что-то около 97 * 60 = 5 820 bytes данных строки и добавление примерно одинаковых количество метаданных к нему, мы не приземлимся даже близко к результату, возвращаемому pg_table_size: 49 152 байта.

Действительно ли метаданные занимают ~ 9x места по сравнению с чистыми данными в postgres?

1 Ответ

2 голосов
/ 29 января 2020

Фактор 9 явно больше потраченного впустую пространства («раздувания»), чем должно быть:

  • Каждая страница имеет 16-байтовый заголовок.

  • Каждая строка имеет 23-байтовый «заголовок кортежа».

  • Будет четыре байта заполнения между id и timestamp и между count и total по причинам выравнивания (вы можете избежать этого, переупорядочив столбцы).

  • Более того, каждый кортеж имеет «указатель строки» в два байта на странице данных.

Подробнее см. в этом ответе .

Чтобы точно узнать, как используется пространство в вашей таблице, установите расширение pgstattuple:

CREATE EXTENSION pgstattuple;

и используйте функцию pgstattuple на столе:

SELECT * FROM pgstattuple('tablename');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...