Como obtener la lista de tablas con más movimiento (insert,update) en Oracle

A fin de obtener una lista aproximada de las tablas con más movimientos de la base de datos podemos consultar el contenido de la tabla dba_tables y cruzarlo con el estado actual de cada tabla en la bbdd. Esto puede tener sentido cuando queremos confeccionar una lista de tablas a las que se debe actualizar estadísticas periódicamente o queremos controlar la cantidad de información que genera alguna aplicación en concreto. Los datos que obtenemos por cada tabla son siempre respecto al último analisis de la misma.

La siguiente forma de hacerlo es un poco "rupestre" pero útil a la vez:

  1. Nos conectamos a la base de datos como system y ejecutamos la siguiente consulta que nos devolvera una lista de selects con todas las tablas de la base de datos (es mejor filtrar para no incluir las tablas de sistema o incluir solo las de un usuario en concreto). En el ejemplo obtendremos solo las de un usuario en concreto:

    select 'select ''' || table_name || ''' as TABLA, ''' || sysdate ||
           ''' as FECHA_ACTUAL, ''' || last_analyzed ||
           ''' as ULTIMO_ANALISIS, count(*) as RECUENTO,' || num_rows ||
           ' as RECUENTO_ANALISIS ,  to_date(''' || sysdate ||
           ''', ''DD/MM/YYYY'') - to_date(''' || last_analyzed ||
           ''',''DD/MM/YYYY'') as DIAS_DESDE_ANALISIS , count(*) - ' || num_rows ||
           ' as DIFERENCIA_RECUENTO, (count(*) - ' ||
           num_rows || ')/(to_date(''' || sysdate ||
           ''', ''DD/MM/YYYY'') - to_date(''' || last_analyzed ||
           ''',''DD/MM/YYYY'')) as INCREMENTO_DIARIO   from ' || owner || '.' ||
           table_name || ' union '
      from dba_Tables
    where owner = 'USUARIO'


    Ejemplo del resultado con plsql:

     

  2. Copiamos toda la columna en el portapapeles y quitamos el último union. Obtendremos el siguiente resultado:

    Podemos ver la tabla con los datos del último analisis de la tabla respecto a los actuales y la variación con su media diaria en número de registros (teniendo en cuenta que un insert(1row) + delete(1row) = 0movimientos )
     

Si a esto le sumamos otros datos como tamaños de fila, si la tabla tiene índices y lo que se nos ocurra podemos hacer otros "trabajos manuales" como acumular esos resultados en una tabla para ver que se cuece en nuestra base de datos.  Eso sí, cada uno puede adaptar esta técnica a su gusto para cubrir sus necesidades