PostgreSQL: Останній час доступу до таблиці


10

Я відповідаю за велику базу даних PostgreSQL з кількома десятками таблиць. Я підозрюю, що до багатьох цих таблиць ніколи не звертаються.

Який найкращий спосіб перевірити, коли в останній раз зверталися до певної таблиці? Я думав про додавання тригера DELETE, INSERTі UPDATE, але я сподіваюся , що є більш ефективний спосіб.



Спасибі, виправлено. Реєстрація може бути вирішенням, але БД широко використовується і журнали, ймовірно, займуть багато місця на диску.
Адам Матан

Відповіді:


9

pg_catalog.pg_statio_all_tables - ваш друг. Все, що вам потрібно зробити, - це періодично опитувати pg_statio_all_tables для відповідних таблиць. Зміна статистики ~ активна таблиця, незмінна статистика ~ потенційно невикористана таблиця. Будьте обережні, щоб ніхто не робив select pg_stat_reset () ;посеред вашого моніторингу.

Наприклад:

test_1=# create table test_stats (col1 integer);
CREATE TABLE

test_1=# select * from pg_catalog.pg_statio_all_tables 
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |              0 |             0 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

Вкладиші:

test_1=# insert into test_stats (col1) select generate_series( 1, 10000000);
INSERT 0 10000000

test_1=# select * from pg_catalog.pg_statio_all_tables
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |          44260 |      10088481 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

Вибирає:

test_1=# select count (*) from test_stats where col1 between 10000 and 50000;
 count 
-------
 40001
(1 row)

test_1=# select * from pg_catalog.pg_statio_all_tables
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |          85560 |      10091429 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

Видаляє:

test_1=# delete from test_stats where col1 between 10000 and 50000;
DELETE 40001

test_1=# select * from pg_catalog.pg_statio_all_tables
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |         155075 |      10136163 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

оновлення-- 2011-09-01

Подальше тестування вказує на те, що, vacuumсхоже, дещо збільшуються значення в pg_statio_all_tables, що шкода для бажаного використання. Хоча vacuumвикористання pg_statio_all_tables не даремно, але інтерпретація результатів робить нечіткішими.

Можливо, краще місце для моніторингу - pg_catalog.pg_stat_all_tables (принаймні, з новішими версіями Pg). Я дивлюся на версію 8.4, і нараховується кількість вкладених, прочитаних, оновлених та видалених кортежів - ISTR 8.2 не має всього цього, і я не знаю про 8.3, тому YMMV залежно від версії Pg, яку ви перебуваєте використовуючи.

Третім варіантом (для вставки, оновлення та видалення) є перегляд часових міток файлів у каталозі $ PGDATA / base / $ datid. Ім'я файлу має відображатись в таблиці таблиці, щоб ви могли використовувати це для ідентифікації таблиць, які не отримують вставок, оновлень або видалень. На жаль, це не стосується таблиць, які все ще вибираються з, і використання табличних просторів спричинить додаткові ускладнення (оскільки ці файли не будуть під $ PGDATA / base / $ datid). Часові позначки не оновлюються, доки не будуть змінені очікувані зміни, але якщо файл не змінився протягом місяців, шанси на зміну, що очікує на даний момент, ймовірно, невеликі.


3

Ви можете отримати деяку інформацію про останню зміну таблиці xmin, наприклад:

select max(xmin::text::bigint) from t;

Але, вам потрібно бути в курсі модуля та обгортання та заморожених xids . Не існує жодного способу перетворення цього в "час", але якщо ви зараз зафіксуєте значення для своїх таблиць, а потім порівняйте їх на пізнішій даті, ви можете отримати список таблиць, які змінилися

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.