PostgreSQL: último tiempo de acceso a la tabla


10

Estoy a cargo de una gran base de datos PostgreSQL, con pocas docenas de tablas. Sospecho que nunca se accede a muchas de estas tablas.

¿Cuál es la mejor manera de verificar cuándo fue la última vez que se accedió a cierta tabla? Pensé en añadir un disparador en DELETE, INSERTy UPDATE, pero espero que hay una manera más eficiente.



Gracias, corregido. El registro puede ser la solución, pero la base de datos se usa mucho y los registros probablemente ocuparán mucho espacio en disco.
Adam Matan el

Respuestas:


9

pg_catalog.pg_statio_all_tables es tu amigo. Todo lo que debe hacer es sondear periódicamente pg_statio_all_tables para las tablas en cuestión. Estadísticas cambiantes ~ tabla activa, estadísticas no cambiantes ~ tabla potencialmente no utilizada. Solo tenga cuidado de que nadie haga una tarea select pg_stat_reset () ;en medio de su monitoreo.

Por ejemplo:

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)

Insertos:

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)

Selecciona:

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)

Elimina:

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)

actualización-- 2011-09-01

Las pruebas adicionales indican que vacuumparece aumentar un poco los valores en pg_statio_all_tables, lo cual es lamentable para el uso deseado. Si bien vacuumno hace inútil el uso de pg_statio_all_tables, hace que la interpretación de los resultados sea un poco más confusa.

Quizás un mejor lugar para monitorear es pg_catalog.pg_stat_all_tables (al menos con versiones más nuevas de Pg). Estoy mirando la versión 8.4 y que tiene recuentos de tuplas insertadas, leídas, actualizadas y eliminadas: ISTR 8.2 no tiene todo eso y no sé acerca de 8.3, así que YMMV depende de la versión de Pg que sea utilizando.

Una tercera opción (para insertar, actualizar y eliminar actividad) es mirar las marcas de tiempo del archivo en el directorio $ PGDATA / base / $ datid. El nombre de archivo debe correlacionarse con el oid de la tabla, por lo que puede usarlo para identificar tablas que no reciben inserciones, actualizaciones o eliminaciones. Desafortunadamente, esto no aborda las tablas que todavía se seleccionan, y el uso de espacios de tablas causará complicaciones adicionales (ya que esos archivos no estarán por debajo de $ PGDATA / base / $ datid). Las marcas de tiempo no se actualizarán hasta que se eliminen los cambios pendientes, pero si el archivo no ha cambiado en meses, entonces las probabilidades de un cambio pendiente actualmente son probablemente pequeñas.


3

Puede obtener información sobre el último cambio en una tabla con xmin, por ejemplo:

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

Pero, debe tener en cuenta el módulo y los xids envolventes y congelados . No hay ninguna forma de convertir esto en un "tiempo", pero si captura el valor de sus tablas ahora, luego compara en una fecha posterior, puede obtener una lista de tablas que han cambiado

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.