Consejos de Oracle de Burleson Consulting |
Dentro de estos dos optimizadores, Oracle proporciona varios modos de optimizador. Se puede establecer un modo optimizador para toda la base de datos o para una sesión específica de Oracle. Los modos de optimizador incluyen rule, first_rows, all_rows y choose. Echemos un vistazo más de cerca a cada uno de estos objetivos.
Modo de regla
La sugerencia de regla ignorará el CBO y las estadísticas y generará un plan de ejecución basado únicamente en la información básica del diccionario de datos. Siempre es una buena idea intentar ajustar una instrucción SQL específica utilizando el RBO mediante una sugerencia de regla o emitiendo la regla alter session set optimizer_goal=. Sin embargo, recuerde siempre que el RBO puede elegir un índice menos que ideal para atender una consulta.
Optimizer_mode = choose
El modo choose optimizer permite a Oracle elegir el objetivo de optimizador más adecuado. Este es el modo de optimizador predeterminado dentro de Oracle, y generalmente utiliza la presencia de estadísticas para determinar qué optimizador invocar. Si no existen estadísticas, Oracle utilizará el objetivo de regla. Si existen estadísticas, Oracle elegirá first_rows o all_rows, dependiendo de la presencia de índices y la configuración de paralelismo y db_file_multiblock_read_count.
Advertencia: Tener estadísticas incompletas con el modo elegir optimizador puede causar grandes ralentizaciones. Si Oracle detecta una sola tabla en una consulta con estadísticas, utilizará el optimizador basado en costos y calculará estadísticas para las otras tablas en tiempo de ejecución. Esto puede causar una gran desaceleración de la ejecución de SQL. Este problema es muy común con los principiantes de Oracle Remote DBA porque el modo predeterminado es choose, y porque los DBA remotos para principiantes a veces emiten selectivamente el comando analyze, sin darse cuenta de que están afectando los tiempos de ejecución de SQL.
modo first_rows
Este es un modo optimizador basado en costos que devolverá filas lo antes posible, incluso si la consulta general se ejecuta más tiempo o consume más recursos. El modo optimizador first_rows generalmente implica elegir un escaneo de índice completo en lugar de un escaneo paralelo de tabla completa. Debido a que el modo first_rows favorece los escaneos de índices sobre los escaneos de tabla completa, el modo first_rows es el más apropiado para sistemas en línea donde el usuario final desea ver algunos resultados lo más rápido posible.
modo all_rows
Este es un modo optimizador basado en costos que garantiza que el tiempo total de consulta se minimice, incluso si se tarda más en recibir la primera fila. Esto generalmente implica elegir un escaneo paralelo de tabla completa en lugar de un escaneo de índice completo. Debido a que el modo all_rows favorece los escaneos de tabla completa, el modo all_rows es el más adecuado para consultas orientadas a lotes donde no se requieren filas intermedias para la visualización.
¿Qué es «mejor»? Rápida ejecución frente mínimo uso de recursos.
Para comprender la filosofía de Oracle con respecto a la ejecución rápida y el consumo mínimo de recursos, necesitamos mirar un ejemplo simple. Para ilustrar la diferencia entre all_rows y first_rows con un ejemplo simplista, considere la siguiente consulta:
seleccionar
last_name
de
cliente
ordenar por
last_name;
Esta consulta se puede atender de dos maneras:
-
Escaneo de tabla completa: Aquí realizamos un escaneo de tabla completa en paralelo y ordenamos las filas en el espacio de tabla TEMPORAL. A modo de ilustración, supongamos que este plan de ejecución produce el tiempo de ejecución general más rápido y el uso mínimo de recursos (Figura 2).
Figura 2: Realizar un análisis de tabla completa y una clasificación (all_rows)
-
Escaneo de índice completo: Aquí recuperamos las filas en orden de nombre de last utilizando un índice de last_name_index. Esta técnica da como resultado más lecturas físicas, pero comienza a devolver filas ordenadas casi de inmediato (Figura 3).
Gráfico 3: Realice una recuperación de índice (first_rows)
De nuevo, suponiendo que aceptemos que el escaneo de tabla completa y la ordenación es menos intensiva en E/S que el escaneo de índice completo, entonces podemos ver claramente la diferencia en los objetivos del optimizador. El análisis de índice completo comenzará a devolver filas casi de inmediato a expensas de E/S adicionales, mientras que el análisis de tabla completa requerirá menos recursos, pero el conjunto de resultados no estará disponible hasta el final de la consulta.
Este es un extracto de «Oracle High-Performance SQL Tuning» de Donald K. Burleson, publicado por Oracle Press.