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

Cómo encontrar una tabla donde las estadísticas están bloqueadas

Las estadísticas jugaron un papel clave para el ajuste del rendimiento de Oracle. Oracle Optimizer crea el plan de ejecución basado en las estadísticas de la tabla de Oracle involucrada en las consultas SQL.

Es posible que desee bloquear estadísticas en una tabla de Oracle en algunos casos, por ejemplo

  • no desea que una tabla sea analizada por el trabajo de estadísticas de programación, sino que desea analizarla más tarde o con una estimación más alta
  • no desea generar las estadísticas de la tabla por motivos de rendimiento
  • no desea que el servidor dedique tiempo a generar estadísticas cuando los datos de la tabla no cambian

Podría haber muchos más casos en los que queramos bloquear estadísticas

Índice

  • Cómo bloquear estadísticas en la tabla
    • Cómo encontrar una tabla donde las estadísticas están bloqueadas
    • Ejecutando trabajo de generación de estadísticas en la tabla donde las estadísticas están bloqueadas 
    • Cómo desbloquear estadísticas para tablas y esquemas/desbloquear estadísticas de tablas para esquemas
    • Creación de índices con estadísticas bloqueadas en la tabla

Cómo bloquear estadísticas en la tabla

Puede usar el paquete estándar de Oracle DBMS_STATS para bloquear las estadísticas en la tabla

exec dbms_stats.lock_table_stats('table_owner','table_name');
Example

SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH';

STATTYPE_LOCKED
—–------------

exec dbms_stats.lock_table_stats('TEST','TECH');

SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH';

STATTYPE_LOCKED
—–--------
ALL

Cómo encontrar una tabla donde las estadísticas están bloqueadas

Puede usar la consulta a continuación para encontrar todas las tablas donde las estadísticas están bloqueadas

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

Ejecutar trabajo de generación de estadísticas en la tabla donde las estadísticas están bloqueadas 

Si intentamos ejecutar recopilar estadísticas en las tablas donde las estadísticas están bloqueadas, obtenemos las estadísticas del objeto ORA-20005 están bloqueadas (stattype =all)

SQL> exec dbms_stats.gather_table_stats('TECH', 'TEST');
BEGIN dbms_stats.gather_table_stats('TECH', 'TEST'); END;

*
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at “SYS.DBMS_STATS”, line 10640
ORA-06512: at “SYS.DBMS_STATS”, line 10664
ORA-06512: at line 1

Podemos realizar los pasos a continuación para desbloquear las estadísticas y generar las estadísticas y volver a bloquear

exec dbms_stats.unlock_table_stats('TECH','TEST');

exec dbms_stats.gather_table_stats('TECH', 'TEST');

exec dbms_stats.lock_table_stats('TECH','TEST');

or

exec dbms_stats.gather_table_stats('TECH', 'TEST',force=>true);

Cómo desbloquear estadísticas para tablas y esquemas/desbloquear estadísticas de tablas para esquemas

Ahora, una vez que encontramos los objetos, podemos usar las siguientes consultas para desbloquearlos

unlock table stats for schema
exec dbms_stats.unlock_schema_stats('schema_owner');

exec dbms_stats.unlock_table_stats('table_owner','table_name');


Example

exec dbms_stats.unlock_schema_stats('TECH');
exec dbms_stats.unlock_table_stats('TECH','TEST');

Creación de índices con estadísticas bloqueadas en la tabla

10g en adelante, cada vez que creamos un índice, las estadísticas se generan automáticamente. Ahora esta ecuación cambia. Cuando la tabla está bloqueada, las estadísticas no se generarán mientras se crea el índice. Necesitamos usar la opción FORCE para recopilar las estadísticas mientras creamos un índice para objetos bloqueados. Entendamos eso en detalle al ver el ejemplo

Example

Lets first create the dummy table and lock the statistics on that table

SQL>  create table test as select a.* ,rownum id from all_objects a where rownum <1001;

SQL> exec dbms_stats.lock_table_stats('TECH','TEST');

Now we will try to create index

SQL> create index test_idx on test(id);

Index created.

SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='TEST_IDX';

NUM_ROWS LAST_ANAL
---------- ---------

So statistics on index is not generated automatically for the locked statistics table

Lets try to generate the statistics using DBMS_STATS

SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX');
BEGIN dbms_stats.gather_index_stats(null, 'TEST_IDX'); END;

*
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 10640
ORA-06512: at "SYS.DBMS_STATS", line 10664
ORA-06512: at line 1

So statistics generation failed.

In order to generate stats on the index, We can use force option in dbms_stats to override this

SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX',force=>true);

PL/SQL procedure successfully completed.

SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='IDX';

NUM_ROWS LAST_ANAL
---------- ---------
1000 01-SEP-17

Lets try to create a new index with compute statistics clause

SQL> create index TEST_IDX1 on test(object_name) compute statistics;
create index idx on test(object_name) compute statistics
*
ERROR at line 1:
ORA-38029: object statistics are locked

So ORA-38029 error happens, So we need to create index with out the compute statistics clause and then  generate stats using force option

SQL> create index TEST_IDX1 on test(object_name);

SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true);

Same things happens if we rebuild the index with compute statistics option

SQL> alter index TEST_IDX1 rebuild compute statistics;
alter index TEST_IDX1 rebuild compute statistics
*
ERROR at line 1:
ORA-38029: object statistics are locked

SQL> alter index TEST_IDX1 rebuild;

Index altered.

SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true);

PL/SQL procedure successfully completed.

Espero que les guste la información sobre cómo bloquear/desbloquear estadísticas de tablas en Oracle. Además, ahora debe saber qué hacer cuando ORA-20005:las estadísticas de objetos están bloqueadas y ORA-38029:estadísticas de objetos están bloqueados sucede

Artículos relacionados
Recopilación de estadísticas en la versión 11i y R12
Recopilación de estadísticas incrementales en 11g
ora-20001 en Recopilación de estadísticas de esquema en 11g(FND_HISTOGRAM_COLS)
Cómo configurar el monitoreo de tablas en Oracle y la relación con STATISTICS_LEVEL
Tutorial de Oracle:Cómo verificar estadísticas obsoletas
Modo optimizador de Oracle
Documentación de Oracle sobre estadísticas