Содержание
Размер таблиц и базы данных
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 <-- размер данных в видимых строках, исключая метаданные строки "заголовок"
Мы ожидаем, что каждый из этих запросов вернет разные числа, и каждый из них полезен для разных целей.