160 likes | 424 Views
Comando Analyze ORACLE. Prof. Ing. Erick López Ch. M.R.I. ANALYZE. Consiste en recopilar y actualizar el CATALOGO de oracle con datos estadísticos . Oracle elige el plan de ejecución más adecuado a cada sentencia (EXPLAIN PLAN ).
E N D
Comando Analyze ORACLE Prof. Ing. Erick López Ch. M.R.I.
ANALYZE • Consiste en recopilar y actualizar el CATALOGO de oracle con datos estadísticos. • Oracle elige el plan de ejecución más adecuado a cada sentencia (EXPLAIN PLAN). • Estos datos no pueden actualizarse en tiempo real porque penlizaría mucho el rendimiento general de la base de datos. • Se actualizan datos como el número de registros de una tabla, el tamaño de los objetos, etc. • Actualmente hay dos formas de actualiza las estadísticas de las tablas e indices, con el comando ANALYZE y con el paquete DBMS_UTILITY.
Comando ANALYZE • Consiste en recopilar y actualizar el CATALOGO de oracle con datos estadísticos • La cláusula COMPUTE hace un cálculo exacto de la estadísticas (tarda más en realizarse en ANALYZE) • La cláusula ESTIMATE hace una estimación partiendo del anterior valor calculado y de un posible factor de variación. • La cláusula DELETE borra las anteriores estadísticas.
Ejemplos ANALYZE • Para analizar tabla con sus indices: • ANALYZE TABLE T_PEDIDOS COMPUTE STATISTICS; • Para analizar solo la tabla: • ANALYZE TABLE T_PEDIDOS COMPUTE STATISTICS FOR TABLE; • Para analizar solo sus indices: • ANALYZE TABLE T_PEDIDOS COMPUTE STATISTICS FOR ALL INDEXES; • Para analizar tabla con sus indices por estimación mirando el 20% de las filas: • ANALYZE TABLE T_PEDIDOS ESTIMATE STATISTICS SAMPLE 20 PERCENT; • Para borrar las estadísticas: • ANALYZE TABLE T_PEDIDOS DELETE STATISTICS;
Consideraciones: • Al validar la estructura se realiza un control de la integridad y puede bloquear la tabla/indice/cluster mientras se está ejecutando. • El recálculo de las estadísticas necesita gran cantidad de espacio de forma temporal. Podriamos tener que incrementar el valor para SORT_AREA_SIZE. • Si usamos la clausula INTO para almacenar una lista de filas enlazadas, la tabla por defecto es CHAINED_ROWS.
Paquete DBMS_UTILITY • El comando ANALYZE esta disponible en todas las versiones de oracle, pero es más comodo, más rapido y se obtienen mejores resultados si se usa el paquete DBMS_UTILITY, disponible a partir de la version 8.0. • DBMS_UTILITY.ANALYZE_SCHEMA('PROGRAMADOR','ESTIMATE', NULL, 10) • DBMS_UTILITY.ANALYZE_DATABASE('ESTIMATE',NULL,20,NULL) • No todos los parámetros deben ser especificados; únicamente los necesarios. • exec dbms_utility.analyze_schema( 'esquemaX', 'COMPUTE', NULL, NULL, NULL) • Este paquete se utiliza para modificar, ver, exportar, importar y borrar estadisticas de la base de datos.
Paquete DBMS_UTILITY • Oracle recomienda la utilización de este paquete a partir de la versión 9i para el calculo de estadisticas en lugar de usar ANALYZE debido a que es mas exacto y mas eficiente. • Cuando se generan nuevas estadisticas para una tabla, columna o indice las estadisticas existentes son actualizadas por Oracle, cuando se actualizan las estadisticas Oracle invalida cualquier SQL que se encuentra en memoria (parsed) que accesa el objeto al cual se les estan calculando estadisticas. • Esto quiere decir que si alguien ejecutó un query sobre la tabla empleados y se empiezan a calcular estadisticas sobre esa tabla Oracle invalida el query SQL que esta compartido en la memoria en lugar de re-utilizarlo. • Oracle utiliza las nuevas estadisticas cuando el query SQL es ejecutado de nuevo y por lo cual puede utilizar un plan de ejecucion diferente.
GATHER_INDEX_STATS (parámetros) http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#sthref8108
Ejemplo EXEC DBMS_STATS.DELETE_INDEX_STATS('SCOTT','PK_EMP'); EXEC DBMS_STATS.DELETE_INDEX_STATS('SCOTT','EMP_PRIMARY_KEY'); select OWNER,INDEX_NAME,NUM_ROWS, SAMPLE_SIZE,LAST_ANALYZED, BLEVEL,LEAF_BLOCKS,DISTINCT_KEYS from dba_indexes where owner = 'SCOTT' and index_name='EMP_PRIMARY_KEY'; AquÍ podemos ver que el Índice no ha sido analizado y por lo tanto no tiene estadisticas aunque la tabla puede llegar a tenerlas • select OWNER,table_NAME,LAST_ANALYZED from dba_tables where owner = 'SCOTT' and table_name = 'EMP';
Ejemplo • Se procede a calcular las estadísticas EXEC DBMS_STATS.GATHER_INDEX_STATS('SCOTT','EMP_PRIMARY_KEY'); • Cuando una tabla es muy pequeña Oracle usa el 100% del compute, es decir NULL en el parámetro compute. Cuando una tabla contiene miles o millones de registros es mejor utilizar: • DBMS_STATS.AUTO_SAMPLE_SIZE
Ejemplo Al igual que el comando ANALYZE si le damos un valor más alto a estimate_percent entones obtendremos estadísticas más exactas, pero de igual manera va a tardar más tiempo en calcularlas. El último ejemplo se calcularon usando AUTO_SAMPLE_SIZE y Oracle decidió que lo ideal era calcular para todos los registros.