PostgreSQL выбирает размер результата

У меня есть таблица в базе данных PostgreSQL, и я делаю выбор из этой таблицы с некоторыми ограничениями, и я хочу знать, сколько места на диске имеет этот выбор. Я знаю, что есть функция postgres pg_total_relation_size, которая дает мне размер некоторой таблицы в БД, но как я могу найти размер «подтаблицы»?

Любые идеи?

Я использую PostgreSQL 9.1.


person golinko    schedule 20.11.2012    source источник
comment
Оператор select не имеет размера диска, потому что он нигде не хранится.   -  person a_horse_with_no_name    schedule 20.11.2012
comment
Итак, мне нужно сначала сохранить его, чтобы получить размер? Есть ли другие альтернативы? Я имею в виду, я просто хочу знать размер подтаблицы...   -  person golinko    schedule 20.11.2012
comment
Вы можете преобразовать его в текстовый файл, чтобы получить приблизительную оценку необработанного размера данных.   -  person a_horse_with_no_name    schedule 20.11.2012
comment
Я только что нашел следующую альтернативу: select sum(octet_length(temp.*::text)) from (select * from lesson) as temp Это работает, и я получаю размер таблицы в текстовом представлении.   -  person golinko    schedule 20.11.2012


Ответы (1)


Чтобы получить размер данных, позволяющий сжатие TOAST и т. д.:

regress=> SELECT sum(pg_column_size(devices)) FROM devices WHERE country = 'US';
 sum 
-----
 105
(1 row)

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

regress=> CREATE TEMPORARY TABLE query_out AS SELECT * FROM devices WHERE country = 'US';
SELECT 3
regress=> SELECT pg_total_relation_size('query_out');
 pg_total_relation_size 
------------------------
                  16384
(1 row)

Почему результаты такие разные? Потому что последний запрос сообщает размер блока 8 КБ для основной таблицы и блока 8 КБ для таблицы TOAST. Неважно, что эти блоки в основном пусты.

person Craig Ringer    schedule 20.11.2012
comment
Спасибо, это именно то, что я искал, octet_length тоже в порядке, но он дает мне количество байтов в двоичной строке, поэтому я получу неправильный размер, если строка будет просто текстом... - person golinko; 21.11.2012
comment
@ann octet_length также не будет точно отражать использование пространства в TOAST. См. stackoverflow.com/questions/13304572/ - person Craig Ringer; 22.11.2012
comment
16384? Что это значит? Это в кб или байтах? - person Mohd Anas; 20.11.2014
comment
@MohdAnas Ну, в руководстве для pg_total_relation_size указано количество байтов. Так что я думаю, что это байты. Если вы хотите, чтобы это было красиво напечатано, используйте pg_size_pretty - person Craig Ringer; 20.11.2014
comment
@CraigRinger спасибо ... Не могли бы вы сказать мне, что мне нужно сделать, если я хочу получить размер нескольких таблиц в одном запросе? - person Mohd Anas; 20.11.2014
comment
@MohdAnas Присоединяйтесь к pg_class, или укажите несколько имен таблиц вручную, или используйте список VALUES. То же, что и любой другой запрос, на самом деле. - person Craig Ringer; 21.11.2014
comment
@CraigRinger, не могли бы вы написать пример запроса? - person Mohd Anas; 21.11.2014
comment
@MohdAnas Если вы застряли после того, как попробовали это сами, задайте новый вопрос. Пожалуйста, дайте ссылку на это для контекста, когда вы это сделаете. - person Craig Ringer; 21.11.2014
comment
@CraigRinger Конечно. Спасибо - person Mohd Anas; 21.11.2014
comment
@CraigRinger, вот мой вопрос, пожалуйста, посмотрите stackoverflow.com/questions/27054654/ - person Mohd Anas; 21.11.2014