У меня есть множество довольно больших таблиц (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

reltuples будет обновляться всякий раз, когда запускается VACUUM (с автоочисткой), поэтому это число обычно имеет погрешность 20%.
Вы получите более точную оценку количества строк в таблице из представления статистики таблицы:
SELECT n_live_tup
FROM pg_stat_user_tables
WHERE schemaname = 'myschema' AND relname = 'mytable';
Это число обновляется сборщиком статистики, поэтому его точность не гарантируется на 100 % (задействован UDP-сокет), и может пройти некоторое время, прежде чем последствия изменения данных станут видны.
Тем не менее, это часто более точная оценка, чем reltuples.
Затем номер будет установлен снова, как только запустится следующий ANALYZE или VACUUM.
а что будет если обнулить статистику? Мне придется извлекать данные из всех 300 таблиц?