PostgreSQL: dernier accès à la table


10

Je suis en charge d'une grande base de données PostgreSQL, avec quelques dizaines de tables. Je soupçonne que bon nombre de ces tables ne sont jamais accessibles.

Quelle est la meilleure façon de vérifier la dernière fois où une certaine table a été consultée? Je pensais que d'ajouter un déclencheur sur DELETE, INSERTet UPDATE, mais je l' espère , il est un moyen plus efficace.



Merci, corrigé. La journalisation peut être la solution, mais la base de données est fortement utilisée et les journaux prendront probablement beaucoup d'espace disque.
Adam Matan

Réponses:


9

pg_catalog.pg_statio_all_tables est votre ami. Tout ce que vous devez faire est d'interroger périodiquement pg_statio_all_tables pour les tables en question. Statistiques changeantes ~ table active, statistiques inchangées ~ table potentiellement inutilisée. select pg_stat_reset () ;Faites juste attention à ce que personne ne le fasse au milieu de votre surveillance.

Par exemple:

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)

Inserts:

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)

Sélectionne:

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)

Supprime:

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)

mise à jour-- 2011-09-01

Des tests supplémentaires indiquent que cela vacuumsemble augmenter quelque peu les valeurs de pg_statio_all_tables, ce qui est regrettable pour l'utilisation souhaitée. Bien que vacuumn'utilise pas pg_statio_all_tables inutile, cela rend l'interprétation des résultats un peu plus floue.

Un meilleur endroit pour surveiller est peut-être pg_catalog.pg_stat_all_tables (au moins avec les nouvelles versions de Pg). Je regarde la version 8.4 et qui compte les tuples insérés, lus, mis à jour et supprimés - ISTR 8.2 n'a pas tout cela et je ne connais pas 8.3 donc YMMV selon la version de Pg que vous êtes en utilisant.

Une troisième option (pour les activités d'insertion, de mise à jour et de suppression) consiste à surveiller les horodatages du fichier dans le répertoire $ PGDATA / base / $ datid. Le nom de fichier doit correspondre à l'oid de la table, vous pouvez donc l'utiliser pour identifier les tables qui ne reçoivent pas d'insertions, de mises à jour ou de suppressions. Malheureusement, cela ne concerne pas les tables qui sont toujours sélectionnées, et l'utilisation d'espaces de table entraînera des complications supplémentaires (car ces fichiers ne seront pas sous $ PGDATA / base / $ datid). Les horodatages ne seront pas mis à jour jusqu'à ce que les modifications en attente soient vidées, mais si le fichier n'a pas changé depuis des mois, les chances d'une modification en attente sont probablement faibles.


3

Vous pouvez obtenir des informations sur la dernière modification d'une table avec xmin, par exemple:

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

Mais, vous devez être conscient du modulo et des xids enveloppants et gelés . Il n'y a aucun moyen de convertir cela en un "temps", mais si vous capturez la valeur de vos tables maintenant, puis comparez à une date ultérieure, vous pouvez obtenir une liste des tables qui ont changé

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.