March 10, 2010

В ожидании 9.0 - размеры таблиц и индексов

Перевод Waiting for 9.0 – table and index sizes с select * from depesz;

(В январе 2010 г. команда разработчиков решила, что следующая версия PostgreSQL будет нумероваться 9.0, а не 8.5)


19 января Tom Lane применил замечательный патч:

Добавлены pg_table_size() и pg_indexes_size() более удобные надстройки над функцией pg_relation_size().

Bernd Helmle, проверил Greg Smith


Чем это замечательно? Тем что я ленивый, и считаю это хорошим свойством, а не плохим.

Рассмотрим пример:

create table x (
id serial primary key,
text1 text,
text2 text,
text3 text
);


Таблица очень простая, также как и данные:

insert into x (text1, text2, text3)
select
repeat( 'text1:' || i, 10 ),
repeat( 'text2:' || i, 100),
repeat( 'text3:' || i, 1000)
from generate_series( 1, 500000 ) i;


Но давайте проверим на сколько она действительно велика.

Теоретически можно сделать:

# select pg_relation_size('x');
pg_relation_size
------------------
816275456
(1 row)


Но это не совсем верно. Ещё есть TOAST. Конечно же надо так:

# select pg_total_relation_size('x');
pg_total_relation_size
------------------------
827760640
(1 row)


Но это опять не решает проблему, т.к. содержит ещё и размер индексов.

Конечно в моём простом примере я могу:

# select pg_total_relation_size('x') - pg_total_relation_size('x_pkey');
?column?
-----------
816504832
(1 row)


Но только представьте себе как было бы "прикольно" (в кавычках) если бы таблица была более реалистичной - с кучей колонок и дюжиной индексов.

Но с этих пор у нас есть 2 функции, которые решат проблему раз и навсегда:

# select pg_table_size('x'), pg_indexes_size('x');
pg_table_size | pg_indexes_size
---------------+-----------------
816504832 | 11255808
(1 row)


Просто и в точку. Больше никаких гаданий, поисков имён toast таблиц и арифметики с размерами индексов. Спасибо Bernd, я это очень оценил.

No comments:

Post a Comment