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