Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать ко-во живых и мертвых строк из служебных таблиц? / 8 сообщений из 8, страница 1 из 1
22.10.2021, 18:07
    #40106201
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать ко-во живых и мертвых строк из служебных таблиц?
Добрый день.
Есть вопрос по статистике.


Имеется таблица. Если дать команду ANALYZE VERBOSE имя-таблицы
и делать это до VACUUM FULL (до очистки БД и таблиц)
то будет выведено кол-во "ЖИВЫХ" строк
и количество "МЕРТВЫХ" строк.

Как это сделать через запрос или где находится эта статистика.
В таблице pg_statistic этой информации не нашел, да и в других так же не нашел.
***********************
Нужно просто анализ на предмет распухших таблиц, которые реально имеют 1000 строк со средним значением всех столбцах (построчно) = 100 байт. В теории должны дать (ну грубо) 100 байт * 1000 строк = 100 кб.
.
Понятно, что там есть еще страницы, но они так же не показатель. Там может быть 20 страниц по 8 кб, а по факту в таблице осталось всего 50 строк, просто таблица была очень распухшей и потом все удалили.

В общем где копать, хоть какие таблицы посмотреть, дальше уже сам по справочникам.

.
.
...
Рейтинг: 0 / 0
22.10.2021, 18:13
    #40106202
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать ко-во живых и мертвых строк из служебных таблиц?
О-О-О,

В pg_stat_user_tables посмотрите.
Но данные там обновляются (auto)analyze.

Ну и dead_tuples != свободное место
может быть таблица с 1 строкой, размером в 100GB и 0 dead tuples (и это вполне валидная ситуация)
поэтому оценить насколько таблица распухла по данным статистике не возможно
для это есть расширение pgstattuple (но оно будет как минимум частично таблицу читать для этой цели).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
22.10.2021, 19:10
    #40106207
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать ко-во живых и мертвых строк из служебных таблиц?
Maxim Boguk,

А есть ли статистика по заполнению таблицы, т.е. вы сказали
Maxim Boguk
может быть таблица с 1 строкой, размером в 100GB и 0 dead tuples (и это вполне валидная ситуация)
, тогда степень заполнения будет примерно (допустим одна строка занимает 20 байт) 20/100GB.
...
Рейтинг: 0 / 0
22.10.2021, 22:29
    #40106230
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать ко-во живых и мертвых строк из служебных таблиц?
Загуглите postgres bloat. Есть скрипт, который считает распухание приблизительно, но быстро.
...
Рейтинг: 0 / 0
23.10.2021, 09:12
    #40106253
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать ко-во живых и мертвых строк из служебных таблиц?
Maxim Boguk
О-О-О,

В pg_stat_user_tables посмотрите.
Но данные там обновляются (auto)analyze.


Максим, Спасибо. Помогло.
Всегда думал, что Vacuum Full не только чистит, но и обновляет статистику.
Ан нет.
Короче, статистика по таблицам не обновится пока не пройдет сам сборщик статистики или не задать принудительно ANALYZE:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Это в начале до очистки, 
n_tup_ins           | 35
n_tup_upd           | 0
n_tup_del           | 28
n_tup_hot_upd       | 0
n_live_tup          | 11 <<--
n_dead_tup          | 28 <<--
n_mod_since_analyze | 4
n_ins_since_vacuum  | 35
last_analyze        | 2021-10-22 17:54:54.727467+03


Это после VACUUM FULL
n_tup_ins           | 35
n_tup_upd           | 0
n_tup_del           | 28
n_tup_hot_upd       | 0
n_live_tup          | 11 <<--
n_dead_tup          | 28 <<--
n_mod_since_analyze | 4
n_ins_since_vacuum  | 35
last_analyze        | 2021-10-22 17:54:54.727467+03 <<--


А это после ANALYZE  = select * from pg_stat_all_tables where relname='ttt'; 
n_tup_ins           | 35
n_tup_upd           | 0
n_tup_del           | 28
n_tup_hot_upd       | 0
n_live_tup          | 7 <<--
n_dead_tup          | 0 <<--
n_mod_since_analyze | 0
n_ins_since_vacuum  | 35
last_analyze        | 2021-10-23 08:59:44.568247+03 <<--



.
...
Рейтинг: 0 / 0
23.10.2021, 09:26
    #40106255
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать ко-во живых и мертвых строк из служебных таблиц?
Guzya
Загуглите postgres bloat. Есть скрипт, который считает распухание приблизительно, но быстро.


Ну тут в принципе ничего сложного.
Есть столбцы. Там есть данные по столбцам сколько каждый занимает байт.
Есть страницы.
Есть мертвые строки и живые строки. ИХ ТО МНЕ И НЕ ХВАТАЛО!

К примеру у меня 12 столбцов в сумме дают примерно 79 байта (это согласно статистике по всем 12 столбцам) .
Всего 4212 строк.
И в то же время 55 страниц.
Филфактор = 100 (по умолчанию, но я его иногда меняю на 75 или 80 если таблица постоянно перезаписывается),
Статистика , выборка делается по 10%.
Значит 79 байт*4212 = 332748 байт.
Тут есть спорный момент. В документации написано байт, хотя я подозреваю, что это символов. Так если будет "ttt текст", то это будет 9 символов, но вот байт будет (3+1)*1 + 5*2=4+10=14 (русские символы идут как за 2 байта).
По функциям хорошо видна разница размера в байтах и символах.

То есть в теории получаем 332'748 (см выше).
А при запросе показывает 458'752, что внимание!!!, соответствует ко-во блоков/страниц (=8192 байт): 55 блоков
и получаем 8192*55=450560 байт.

Там еще есть модификации.
Но здесь нужен просто параметр. Когда сама таблица весит 3 Гб, а сумма дает 21 Гб, то это уже большой повод задуматься.
Или она распухла или индексы не нужные или там много еще чего. В общем для этого все и делалось.

Когда в вашей БД всего 100-200 таблиц + 50 функций, то все норм, можно и вручную иногда глянуть.
А вот если проект новый, никаких подписей и информации о таблицах нет, а таблиц около 3000 штук
и функций столько же и никакой документации
да и функции писали разные люди и опять же практически без описаний
- то тут реально Ж./головная боль. (жуткая головная боль, ничего нецензурного)! ;-)


***************************************************
P.S.
-- pg_catalog.pg_attribute - это информация по всем слотбцам таблицы, в том числе и служебным и там же примечание/описание к столбцам
-- pg_catalog.pg_statistic - это статистика по каждому столбцу каждой таблицы (примерно)
В общем документация вам в помощь. Благо она хорошо задокументирована. Хотя и не без пробелов.
.
.
...
Рейтинг: 0 / 0
23.10.2021, 09:36
    #40106256
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать ко-во живых и мертвых строк из служебных таблиц?
Maxim Boguk

Еще раз спасибо. Опять помог.
...
Рейтинг: 0 / 0
23.10.2021, 09:36
    #40106257
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать ко-во живых и мертвых строк из служебных таблиц?
О-О-О,

Поэтому часто имеет смысл делать vacuum full analyze table; ну или ANALYZE TABLE; после vacuum full.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать ко-во живых и мертвых строк из служебных таблиц? / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]