sql >> Base de Datos >  >> RDS >> Oracle

Cómo comprobar las estadísticas obsoletas

Las estadísticas pueden volverse obsoletas cuando los datos de la tabla cambian sustancialmente. Las estadísticas actualizadas son importantes para generar buenos planes de ejecución

Cómo decide Oracle si las estadísticas se han vuelto obsoletas

Las estadísticas se consideran obsoletas cuando #(INSERTS + UPDATES + DELETES)>=10 % de NUM_ROWS de dba_tables:

Configuración de parámetros necesaria para realizar un seguimiento de los cambios en la tabla

Antes de Oracle 10g, la recopilación automatizada de estadísticas para objetos que se habían vuelto obsoletos se controlaba mediante la configuración del indicador MONITOREO en la tabla.
Dependiendo del indicador MONITOREO, el trabajo GATHER_STATS_JOB recopilaba "RECOPILACIÓN VACÍA" y "RECOPILACIÓN OBSERVADA" en los objetos marcados.

En 10g, las palabras clave MONITORING y NOMONITORING están en desuso y se ignorarán. La función de supervisión de tablas ahora está controlada por el parámetro STATISTICS_LEVEL.

Cuando STATISTICS_LEVEL se establece en BÁSICO, el monitoreo está deshabilitado en la tabla.
Cuando STATISTICS_LEVEL se establece en TÍPICO, entonces el monitoreo está habilitado.
De manera predeterminada, STATISTICS_LEVEL se establece en TÍPICO y el monitoreo de tablas está habilitado. Se recomienda enfáticamente establecer STATISTICS_LEVEL en TYPICAL en 10g y superior
Al establecer este parámetro, Oracle realiza un seguimiento del número aproximado de operaciones INSERTAR, ACTUALIZAR y ELIMINAR para la tabla de Oracle desde la última vez que se recopilaron las estadísticas. Esta información sobre los "cambios realizados" se mantiene en el SGA y periódicamente (aproximadamente cada 15 minutos) el SMON vacía los datos en las tablas del diccionario de datos. Puede vaciar manualmente la información llamando a dbms_stats.FLUSH_DATABASE_MONITORING_INFO(). La información del diccionario de datos se hace visible a través de las vistas:DBA_TAB_MODIFICATIONS, ALL_TAB_MODIFICATIONS y USER_TAB_MODIFICATIONS.

Oracle utiliza estas vistas para identificar las tablas que tienen estadísticas obsoletas.
Cuando hay un cambio del 10 % en los datos de una tabla, Oracle considera que sus estadísticas están obsoletas.

Cómo comprobar las estadísticas obsoletas

El siguiente procedimiento PLSQL descubre todas las tablas en el esquema SCOTT que son estadísticas obsoletas

SET SERVEROUTPUT ON

SQL> DECLARE
ObjList dbms_stats.ObjectTab;
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'SCOTT', objlist=>ObjList, options=>'LIST STALE');
FOR k in ObjList.FIRST..ObjList.LAST
LOOP
dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname);
END LOOP;
END;
/

El siguiente sql también se puede usar para averiguar insertar, actualizar, eliminar

select u.TIMESTAMP,
t.last_analyzed,
u.table_name,
u.inserts,
u.updates,
u.deletes,
d.num_rows,
decode(d.num_rows,0,'Table Stats indicate No Rows',
nvl(TO_CHAR(((U.inserts+u.deletes+u.updates)/d.num_rows) * 100,'999.99')
,'Null Value in USER_TAB_MODIFICATIONS')
) percent
from user_tables t,USER_TAB_MODIFICATIONS u,dba_tables d
where u.table_name = t.table_name
and d.table_name = t.table_name
and d.owner = '&Owner'
and (u.inserts > 3000 or u.updates > 3000 or u.deletes > 3000)
order by t.last_analyzed
/

Si desea ejecutar esto en toda la base de datos

SET SERVEROUTPUT ON

SQL> DECLARE
ObjList dbms_stats.ObjectTab;
BEGIN
DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST STALE');
FOR k in ObjList.FIRST..ObjList.LAST
LOOP
dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname);
END LOOP;
END;
/

Si desea ver las tablas donde las estadísticas están vacías, podemos usar a continuación

SET SERVEROUTPUT ON

SQL> DECLARE
ObjList dbms_stats.ObjectTab;
BEGIN
DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST EMPTY');
FOR k in ObjList.FIRST..ObjList.LAST
LOOP
dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname);
END LOOP;
END;
/

Ahora, una vez que encuentre la lista de tablas, puede generar estadísticas sobre estas tablas.

exec dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME');

También podemos ejecutar el siguiente comando para generar estadísticas sobre todos los objetos obsoletos en el esquema

exec dbms_stats.gather_schema_stats(ownname => '<schema name>', cascade => TRUE, options => 'GATHER AUTO');

A partir de Oracle11g, el umbral de obsolescencia se puede establecer mediante la preferencia de estadísticas STALE_PERCENT. Esto se puede configurar globalmente usando DBMS_STATS.SET_GLOBAL_PREFS o a nivel de tabla usando DBMS_STATS.SET_TABLE_PREFS.

Artículos relacionados

ora-38029:las estadísticas de objeto están bloqueadas
ora-20001 en Recopilar estadísticas de esquema en 11g(FND_HISTOGRAM_COLS)
Recopilación de estadísticas en la versión 11i y R12
Recopilación de estadísticas incrementales en 11g
Cómo establecer Monitoreo de Tablas en Oracle y Relación con STATISTICS_LEVEL