(В январе 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