Postgresql размер таблиц: Размер таблиц и базы данных

Размер таблиц и базы данных

PostgreSQL

SecretSilent

Чтоб узнать размер всех таблиц схемы базы данных достаточно выполнить вот такой запрос:

select table_name, pg_size_pretty( pg_total_relation_size(table_name)) 
from information_schema.tables 
where table_schema = 'table_schema_name' and
table_catalog = 'database_name';

Этот запрос вернет полный размер таблицы, включая индексы и данные TOAST. Чтоб узнать размер таблицы без индексов ( но включая TOAST, карту свободного места и карту видимости ) воспользуйтесь функцией pg_table_size. pg_relation_size() — чтоб узнать объём, который занимает на диске указанный слой (‘main’, ‘fsm’, ‘vm’, ‘init’) заданной таблицы или индекса. Про некоторые другие функции получения размера объектов можно почитать в документации.

Узнать размер баз данных на сервере:

select datname, pg_size_pretty(pg_database_size(datname)) 
from pg_database;

pg_size_pretty возвращает значение размера объектов в удобочитаемом для человека виде, например 36 MB. Однако можно использовать выше указанные функции напрямую. Тогда размер объектов вернется в байтах.

Понравилось это:

Нравится Загрузка…

Отмечено pg_database_size, pg_relation_size, pg_size_pretty, PostgreSQL, размер базы данных, размер таблицы

Смотреть все записи автора SecretSilent

Свежие записи

  • Государственный школьный стандарт — разбор
    07.10.2022
  • PostgreSQL: Установка пользовательских параметров базы данных и/или сессии
    30.09.2022
  • Аналог UNNEST в SQLite
    09.08.2022
  • Не подпиской на Яндекс.Музыку единой
    16.06.2022
  • PostgreSQL: Запрос на получение списка комментариев к колонкам таблицы
    14.06.2022
  • Ветка сакуры упала на грудь…
    23.05.2022
  • PostgreSQL: Результаты запроса в JSON
    28. 03.2022
  • Love sux but music doesn’t
    01.03.2022
  • Прервать соединения IP с базой данных в PostgreSQL
    12.06.2020
  • Лирическое отступление
    29.05.2020
  • Динамическое создание виджетов Qt. QGridLayout
    24.05.2020
  • DBServerWizard — автоматизация работы с базами данных PostgreSQL
    20.05.2020
  • Приятное с полезным: Starset & English
    20.05.2020
  • Настроение Starset — Ricochet
    13.05.2020
  • Немного леса
    21.04.2020

Популярные записи и страницы

  • PostgreSQL: unnest(array)
  • PostgreSQL: Узнать данные о колонках таблицы
  • Основы баз данных. ER-модель (сущность-связь)
  • Функция, возвращающая таблицу returns table — в PostgreSQL и MS SQL Server
  • PostgreSQL: Размер таблиц и базы данных
  • Что быстрее: where или join?
  • Основы баз данных. Логическая модель. 3 основные нормальные формы
  • QTableWidget: добавить список QComboBox  в ячейку
  • Количество подключений к БД PostgreSQL
  • Отображение данных выборки в виджете QTableView

Рубрики

РубрикиВыберите рубрикуC++  (11)Delphi  (2)Qt  (29)SQL  (32)   Microsoft SQL Server  (8)   PostgreSQL  (24)   SQLite  (1)Базы данных  (29)Будни  (13)   «Нет» выгоранию  (5)О том о сём  (31)   Музыка♥  (7)   Мысли вслух  (7)   Фотография  (3)Портфолио  (11)Что творится  (1)

база данных — PostgreSQL. Как удалить все данные из таблицы большого размера?


Вопрос задан


Изменён
2 года назад


Просмотрен
753 раза

Есть таблица (назовем ее logs). В ней скопилось 33GB записей. Необходимо ее очистить. Пытался делать

DELETE FROM logs

Но спустя какое-то время после запуска команды в выводе отобразилось, что удалено N-ое (число было большим) кол-во строк, но размер таблицы остался прежним (полагаю, количество строк также не изменилось). Впервые столкнулся с такой задачей и не знаю, что с этим делать.

Собственно, вопрос: как можно удалить все данные из таблицы logs?


У таблицы есть только Primary Key, индексов нет.

  • база-данных
  • postgresql






1

Если необходимо удалить именно всё — то нужен truncate.

delete никогда не возвращает дисковое пространство напрямую. PostgreSQL — MVCC база, delete только отмечает строку удалённой. Затем приходит autovacuum (либо вручную вызывается vacuum), который вычищает из файлов таблицы мёртвые, никому более недоступные версии строк. В конце работы vacuum проверяет, нет ли в конце таблицы страниц данных, в которых не осталось строк. Если есть — то пробует усечь размер таблицы. Размеры индексов сами никогда не уменьшаются (для этого нужен reindex). Сверх того радости добавляет, что все эти операции пишутся в wal в полном объёме.

truncate же просто выделяет новые пустые датафайлы и удаляет старые. Поэтому для задачи очистить всё — несравнимо эффективнее. Хотя и требует эксклюзивную блокировку.







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации


Почта

Необходима, но никому не показывается




Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки


sql — postgresql список и порядок таблиц по размеру

Так будет понятнее.

pg_size_pretty() — преобразует количество байтов в удобочитаемый формат.

pg_database_size() — получает размер базы данных в байт .

pg_total_relation_size() — получает общий размер таблицы и ее индекс в байт .

pg_relation_size() — получает размер отношения (таблица/индекс) в байт .

pg_indexes_size(<имя_отношения>) — получает размер индекса отношения в байтах .

current_database() — получает текущую используемую базу данных, к которой выполняется этот запрос.

Запрос:

 выберите current_database() в качестве базы данных,
       pg_size_pretty(total_database_size) как total_database_size,
       имя_схемы,
       имя_таблицы,
       pg_size_pretty(total_table_size) как total_table_size,
       pg_size_pretty(table_size) как table_size,
       pg_size_pretty(index_size) как index_size
       из ( выберите имя_таблицы,
                table_schema как имя_схемы,
                pg_database_size(current_database()) как total_database_size,
                pg_total_relation_size(table_name) как total_table_size,
                pg_relation_size(table_name) как table_size,
                pg_indexes_size(table_name) как index_size
                из information_schema. tables
                где table_schema=current_schema() и table_name, например 'table_%'
                упорядочить по total_table_size
            ) как размеры;
 

Результат:

 база данных | общий_размер_базы_данных | имя_схемы | имя_таблицы | общий_размер_таблицы | размер_таблицы | index_size
--------------------------+-----------------------------------+--------------+-- -------------------------+----+-------------+------- -----
 виннешдб | 1586 МБ | корпданные | таблица_ааа | 16 КБ | 0 байт | 8192 байта
 виннешдб | 1586 МБ | корпданные | таблица_bbb | 24 КБ | 0 байт | 16 КБ
 виннешдб | 1586 МБ | корпданные | таблица_ccc | 640 КБ | 112 КБ | 488 КБ
 виннешдб | 1586 МБ | корпданные | таблица_ddd | 9760 КБ | 3152 КБ | 6568 КБ
 виннешдб | 1586 МБ | корпданные | table_ee | 1120 МБ | 311 МБ | 808 МБ
 

Гуманизированный формат представлен в байт , КБ , МБ , ГБ и ТБ .

байт от до кБ — начинается с 10240 байт

байт от до МБ — начинается с 10985206 байт . 5 кБ ~ 10 МБ

байт от до ГБ — начинается с 10736893952 байт = 10239,5 МБ ~ 10 КБ

3 5 байт от

до ТБ — начинается с 10994579406848 байт = 10239,5 ГБ ~ 10 ТБ

Все преобразования единиц измерения начинаются с 10 + .

Для справки — официальная документация Postgres

база данных — размер столбца PostgreSQL и размер таблицы

спросил

Изменено
1 год, 4 месяца назад

Просмотрено
2к раз

Я пытаюсь получить только один размер таблицы, а затем размер каждой строки.
Пока я использовал

 SELECT pg_table_size(*mytable*) as DATA;
 

получаю 393216 байт.

Использование

 SELECT (SUM(pg_column_size(t) - 24)) FROM *mytable* AS t;
 

(как написано здесь Как получить размер каждой строки конкретной таблицы в postgresql..?)

Я получаю 560669 байт.

560669 против 393216 байт — какой из них настоящий?

  • база данных
  • postgresql
  • размер

6

Из https://www.postgresql.org/docs/14/functions-admin.html

pg_table_size — Вычисляет дисковое пространство, используемое указанной таблицей,
исключая индексы (но включая его таблицу TOAST, если таковая имеется, свободное место
карту и карту видимости).

Итак, pg_table_size дает вам объем диска, который postgres использует для таблицы, и для некоторых метаданных, которые postgres хранит о таблице (карта видимости и карта свободного пространства). Удаление строки не уменьшит это число (если только вы не выполните VACUUM FULL), поэтому мы не ожидаем, что диск, используемый таблицей, будет соответствовать сумме данных в каждой видимой строке. Вместо этого диск, используемый таблицей, будет больше.

pg_column_size — показывает количество байтов, используемых для хранения отдельных
значение данных. Если применяется непосредственно к значению столбца таблицы, это отражает
любое сжатие, которое было сделано.

Таким образом, возвращается размер каждой строки на диске (включая информацию о заголовках строк, хранящуюся на диске).

Я не уверен, считаете ли вы информацию заголовка строки «реальной», но она занимает место на вашем жестком диске, так что правильно это или нет, зависит от вашего варианта использования.

Используя пример таблицы из базы данных, у меня есть:

 SELECT pg_table_size('users')
-- 3751936 <-- размер моей таблицы пользователей на диске, включая метаданные таблицы
SELECT (SUM(pg_column_size(t.*))) FROM пользователей AS t;
-- 3483028 <-- общий размер видимых строк на диске, включая метаданные "заголовка" строки.
SELECT (SUM(pg_column_size(t.*)-24)) FROM пользователей AS t;
-- 3069412 <-- размер данных в видимых строках, исключая метаданные строки "заголовок"
 

Мы ожидаем, что каждый из этих запросов вернет разные числа, и каждый из них полезен для разных целей.

This entry was posted in Популярное