domingo, 16 de junio de 2013

Optimizer, Estadísticas Oracle

show parameters optimizer ;

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
optimizer_capture_sql_plan_baselines boolean                          FALSE
optimizer_dynamic_sampling           integer                          2
optimizer_features_enable            string                           11.2.0.3
optimizer_index_caching              integer                          0
optimizer_index_cost_adj             integer                          100
optimizer_mode                       string                           ALL_ROWS
optimizer_secure_view_merging        boolean                          TRUE
optimizer_use_invisible_indexes      boolean                          FALSE
optimizer_use_pending_statistics     boolean                          FALSE
optimizer_use_sql_plan_baselines     boolean                          TRUE

¿Se pueden saber las consultas SQL que se ejecutan en Oracle y ordernarlas por consumo de CPU? me gustaría ver las consultas SQL que ejecutan las aplicaciones de Facturación, Contabilidad, Recursos Humanos, etc. y saber cuáles son las que más CPU usan, así analizaré si las estadísticas están siendo efectivas.


Prueba con esta consulta SQL: 

Código:

select elapsed_time/1000000, executions, cpu_time, sql_text 
from v$sql 
where elapsed_time > 0 
order by cpu_time desc 


¿Cómo puedo mostrar los trabajos programados (scheduler jobs) en Oracle? lo necesito para saber a qué hora se ejecutan las estadísticas de mi base de datos Oracle.


Puedes usar esta consulta SQL Oracle: 

Código:

SELECT owner Propietario, job_name Nombre_Tarea, 
    enabled Activo, j.FAILURE_COUNT Intentos_Fallidos, 
    to_char(j.NEXT_RUN_DATE) Proxima_Ejecucion 
FROM dba_scheduler_jobs j 


¿Cómo fuerzo un análisis de estadísticas de un usuario Oracle?


Puedes usar este procedimiento almacenado, ejecutando la siguiente orden desde SQL Plus de Oracle: 

Código:

exec dbms_stats.gather_schema_stats (ownname =>'NOMBRE_USUARIO', estimate_percent => NULL, cascade => true); 


¿Cómo puedo eliminar las estadísticas de un usuario de Oracle 10g?


Puedes ejecutar el siguiente procedimiento almacenado desde SQL Plus: 

Código:

exec dbms_utility.analyze_schema ('NOMBRE_USUARIO', 'DELETE'); 


¿Cómo puedo cambiar el optimizer_mode de CHOOSE que es como lo tengo a RULE que es como me han recomendado los desarrolladores del software de facturación y contabilidad que uso?


Desde SQL Plus, una vez conectado, ejecuta este comando: 

Código:

alter system set optimizer_mode = 'RULE' scope = memory; 


Con "scope = memory" realizarás el cambio en tiempo real y en caliente, sin necesidad de detener la base de datos. Pero con este comando, cuando reinicies la base de datos, no se te quedará guardado. Para guardarlo definitivamente ejecuta este otro: 

Código:

alter system set optimizer_mode = 'RULE' scope = spfile; 



Y si quieres que quede activo el cambio en el mismo momento y que, además, quede guardado, ejecuta este otro comando: 

Código:

alter system set optimizer_mode = 'RULE' scope = both; 


La diferencia entre estos últimos parámetros: 

* scope = memory aplica el cambio en tiempo real, sin detener la base de datos, siempre que el parámetro lo permita. El cambio no quedará guardado en el fichero de configuración de Oracle, por lo que en el próximo reinicio no se aplicará. 

* scope = spfile no aplica el cambio en tiempo real, hasta que no se reinicie la base de datos. El cambio del valor del parámetro queda guardado en el fichero de configuración de Oracle y se aplicará cuando se reinicie la base de datos. 

* scope = both aplica el cambio en tiempo real, sin necesidad de reiniciar la base de datos. El cambio del valor del parámetro queda guardado en el fichero de configuración de Oracle para posteriores reinicios de la base de datos.


puedes usar la siguiente consulta SQL de Oracle, que te mostrará la fecha y hora del último análisis realizado por Oracle sobre las estadísticas de todas las tablas de un usuario: 

Código:

select table_name, to_char (last_analyzed, 'dd-mm-yyyy hh:mi') 
from dba_tables 
where owner='NOMBRE_USUARIO' 
order by last_analyzed desc 

No hay comentarios: