PostgreSQL: Czas ostatniego dostępu do tabeli


10

Jestem odpowiedzialny za dużą bazę danych PostgreSQL z kilkadziesiąt tabelami. Podejrzewam, że do wielu z tych tabel nigdy nie ma dostępu.

Jaki jest najlepszy sposób sprawdzenia, kiedy ostatnio uzyskiwano dostęp do określonego stołu? Myślałem o dodanie spust DELETE, INSERTa UPDATE, ale mam nadzieję, że jest bardziej efektywny sposób.



Dzięki, poprawione. Rozwiązaniem może być rejestrowanie, ale baza danych jest intensywnie używana i dzienniki prawdopodobnie zajmą dużo miejsca na dysku.
Adam Matan

Odpowiedzi:


9

pg_catalog.pg_statio_all_tables jest twoim przyjacielem. Wszystko, co musisz zrobić, to okresowo sprawdzać tabele pg_statio_all_tables. Zmiana statystyk ~ aktywna tabela, niezmienne statystyki ~ potencjalnie nieużywana tabela. Uważaj tylko, aby nikt nie select pg_stat_reset () ;monitorował.

Na przykład:

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)

Wstawki:

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)

Wybiera:

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)

Usuwa:

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)

aktualizacja-- 2011-09-01

Dalsze testy wskazują, że vacuumwydaje się, że nieco zwiększa wartości w tabelach pg_statio_all_tables, co jest niefortunne dla zamierzonego zastosowania. Chociaż vacuumnie używa pg_statio_all_tables bezużyteczne, sprawia, że ​​interpretacja wyników jest nieco bardziej niewyraźna.

Być może lepszym miejscem do monitorowania jest pg_catalog.pg_stat_all_tables (przynajmniej z nowszymi wersjami Pg). Patrzę na wersję 8.4, która ma liczbę wstawionych, odczytanych, zaktualizowanych i usuniętych krotek - ISTR 8.2 nie ma tego wszystkiego i nie wiem o 8.3, więc YMMV zależy od wersji Pg, którą jesteś za pomocą.

Trzecią opcją (dla czynności wstawiania, aktualizacji i usuwania) jest oglądanie znaczników czasowych plików w katalogu $ PGDATA / base / $ datid. Nazwa pliku powinna być odwzorowana na OID tabeli, abyś mógł użyć jej do identyfikacji tabel, które nie otrzymują wstawek, aktualizacji lub usunięć. Niestety nie dotyczy to tabel, które wciąż są wybierane, a korzystanie z obszarów tabel spowoduje dodatkowe komplikacje (ponieważ pliki te nie będą w katalogu $ PGDATA / base / $ datid). Znaczniki czasu nie zostaną zaktualizowane, dopóki wszelkie oczekujące zmiany nie zostaną usunięte, ale jeśli plik nie zmienił się od miesięcy, szanse na oczekującą zmianę są prawdopodobnie niewielkie.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.