Jugando con las estadisticas de un esquema

Hoy vamos a ver algunas consultas practicas de las estadisticas de sistema

Esquemas o objetos de un esquema con las estadisticas bloqueadas

Veamos algunas consultas utiles para comprobar cuales son las tablas que estan bloqueadas o para trabajar con las estadistias del esquema APPSCHEMA

Tablas conlas estadisticas bloqueadas para un esquema


select owner, table_name, stattype_locked
from dba_tab_statistics
where
stattype_locked is not null and OWNER=’APPSCHEMA’;

Cuando fueron bloqueadas las estadisticas en estas tablas?


set linesize 200
set pagesize 0
col owner format a20;
col table_name format a30;
Select table_name,last_analyzed from dba_tables
where table_name in
(select table_name from dba_tab_statistics where stattype_locked is not null and OWNER=’APPSCHEMA’)
order by last_analyzed asc ;

Tenemos una metaconsulta para desbloquearlas todas?

  select 'exec dbms_stats.unlock_table_stats('||chr(39)||'APPSCHEMA'||chr(39)||','||chr(39)||TABLE_NAME||chr(39)||' );'
       from dba_tab_statistics where stattype_locked is not null and OWNER='APPSCHEMA';

Ver las fechas de las estadisticas que han sido analizadas en los ultimos 2 dias

set pagesize 9000;
column owner format a20;
column TABLE_NAME format a30;
column PARTITION_NAME format a30;
select owner,table_name,partition_name,to_char(LAST_ANALYZED,'dd-mm-yy hh:mi'),NUM_ROWS,STATTYPE_LOCKED from dba_TAB_STATISTICS
where OWNER='APPSCHEMA' 
and LAST_ANALYZED  < sysdate-2
order by LAST_ANALYZED asc ;

Ver la fecha en la que fueron obtenidas las estadisticas de una tabla en concreto

set pagesize 9000;
column owner format a20;
column TABLE_NAME format a30;
column PARTITION_NAME format a30;
select owner,table_name,partition_name,to_char(LAST_ANALYZED,'dd-mm-yy hh:mi'),NUM_ROWS,STATTYPE_LOCKED from dba_TAB_STATISTICS
where TABLE_NAME='APPSCHEMA' 
order by LAST_ANALYZED asc ;

Como salvamos las estadisticas de un determinado esquema

Creamos una tabla de estadisticas llamada «MISTATS bajo el esquema APPSCHEMA

exec dbms_stats.create_stat_table(ownname => 'APPSCHEMA', stattab => 'MISTATS');

Si quisiesemos guardar solo las estadisticas de una tabla

  
exec dbms_stats.export_table_stats(ownname=>'APPSCHEMA', tabname=>'MISTATS', statown=>'APPSCHEMA', stattab=>'MISTATS', cascade=>true);

Si queremos salvar los de un esquema

EXEC DBMS_STATS.export_schema_stats('APPSCHEMA','MISTATS',NULL,'APPSCHEMA');

Mas informacion en

ORA-20005 Estadisticas bloqueadas

Hoy vamos a ver la causa de un problema que pude darse en sistemas en los que hay varias personas administrando o con privilegios sobre distintos objetos de la base de datos. Una de las situaciones que se pueden dar, es que , uno de los usuarios intente lanzar las estadisticas del planificador de los objetos sobre los que tiene privilegios y se encuentre con un :

ORA-20005: object statistics are locked (stattype = ALL) 
ORA-06512: at "SYS.DBMS_STATS", line 13182 
ORA-06512: at "SYS.DBMS_STATS", line 13202 
ORA-06512: at line 2

¿Por que sucede esto?
Sencillamente, por que, como bien dice el error de oracle, por que alguien ha bloqueado las estadísticas.
Ante todo, el bloqueo de las estadisticas no es algo automático, es una opción deliberada que ha de aplicarse sobre determinados objetos, con lo que, si está así es por que ,alguien con privilegios ha decidido que así sea.

Los segundo que nos preguntamos es ¿por que están bloqueadas?
Hay distintas razones por la que podemos querer bloquear las estadísticas de algunos objetos, pro las principales pueden ser :

  • Por razones de rendimiento: Hay entornos en los que los objetos de la base de datos varian mucho durante su periodo de explotación, el dba puede elegir obtener un juego de estadisticas válido durante un periodo tipo, y aplicar este juego de estadisticas indistintamente del periodo de explotacion en el que se encuentre.
  • Por problemas de ventana, ya que, la generación de estadisticas de esos objetos puede ser un proceso demasiado pesado, con lo que , el dba ha decidido bloqearlas y lanzarlas especificamente en una ventana aparte
  • El proceso de cálculo de estadísticas es un proceso bastante pesado , probablemente el administrador del sistema haya decidido bloquearlas para evitar que cualquier otro usuario con permisos decida lanzarlas

En todo caso, si obtenemos este error ORA-20005, necesitaremos comprobar si realmente están bloqueadas, mediante esta consulta podremos ver que objetos de la base de datos tienen las estadisticas bloqueadas.

select owner, table_name, stattype_locked
from dba_tab_statistics
where stattype_locked is not null; 

Lo siguiente que querremos saber, es de cuando son el juego de estadísticas que estamos utilizando, para eso ampliaremos la consulta a:

 select table_name,last_analyzed  from dba_tables 
   where table_name in 
          (select table_name 
                 from dba_tab_statistics 
                     where stattype_locked is not null 
                           and OWNER='ESQUEMAPRUEBAS)
     order by last_analyzed asc 

Para desbloquear todas las estadísticas de un esquema ESQUEMAPRUEBAS podemos usar el metascript

  select 
  'exec dbms_stats.unlock_table_stats('
   ||chr(39)
   ||'ESQUEMAPRUEBAS'
   ||chr(39)||
    ','
   ||chr(39)
   ||TABLE_NAME
   ||chr(39)||' );'
      from dba_tab_statistics where
           stattype_locked is not null 
              and OWNER='ESQUEMAPRUEBAS';

y ver los distintos objetos, o hacerlo directamente con la llamada :

exec dbms_stats.unlock_schema_stats('ESQUEMAPRUEBAS');

Como nota final, hay que tener cuidado con el desbloqueo de estadísticas ya que hay algunas estadísticas del sistema que pueden estar bloqueadas con lo que no conviene desbloquear todas las estadísticas de todos los esquemas.

Para mas información, como siempre esta metalink, allí tenemos la notas relacionadas

  • «ORA-38029 «Object Statistics Are Locked» – Possible Causes [ID 433240.1]»
  • Preserving Statistics using DBMS_STATS.LOCK_TABLE_STATS [ID 283890.1]