Postgres проверяет, были ли вставлены какие-либо новые строки

У меня есть множество довольно больших таблиц (300-400 таблиц, ~ 30 миллионов строк в каждой). Каждый день (раз в день) я должен проверять, были ли вставлены какие-либо новые строки в какую-либо из этих таблиц. Возможное количество вставляемых строк может варьироваться от 0 до 30 миллионов строк. Строки не будут удаляться.

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

SELECT reltuples FROM pg_class WHERE oid='tablename'::regclass;

Главное сомневаюсь: как скоро reltuples обновится, если, например, будет вставлено 3000 строк (или вставлено 5 строк)? И является ли приблизительный подсчет хорошим решением для этого случая?

Мои параметры конфигурации:

autovacuum_analyze_threshold: 50
autovacuum_analyze_scale_factor: 0.1
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
0
310
1

Ответы 1

reltuples будет обновляться всякий раз, когда запускается VACUUM (с автоочисткой), поэтому это число обычно имеет погрешность 20%.

Вы получите более точную оценку количества строк в таблице из представления статистики таблицы:

SELECT n_live_tup
FROM pg_stat_user_tables
WHERE schemaname = 'myschema' AND relname = 'mytable';

Это число обновляется сборщиком статистики, поэтому его точность не гарантируется на 100 % (задействован UDP-сокет), и может пройти некоторое время, прежде чем последствия изменения данных станут видны.

Тем не менее, это часто более точная оценка, чем reltuples.

а что будет если обнулить статистику? Мне придется извлекать данные из всех 300 таблиц?

Takito Isumoro 05.02.2019 12:01

Затем номер будет установлен снова, как только запустится следующий ANALYZE или VACUUM.

Laurenz Albe 05.02.2019 12:11

Другие вопросы по теме