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

Comprensión de los resultados de Ejecutar plan de explicación en Oracle SQL Developer

El resultado de EXPLAIN PLAN es un resultado de depuración del optimizador de consultas de Oracle. El COST es el resultado final del optimizador basado en costos (CBO), cuyo propósito es seleccionar cuál de los muchos planes diferentes posibles se debe usar para ejecutar la consulta. La CBO calcula un Costo relativo para cada plan, luego elige el plan con el costo más bajo.

(Nota:en algunos casos, la CBO no tiene suficiente tiempo para evaluar todos los planes posibles; en estos casos, solo elige el plan con el costo más bajo encontrado hasta el momento)

En general, uno de los mayores contribuyentes a una consulta lenta es la cantidad de filas leídas para atender la consulta (bloques, para ser más precisos), por lo que el costo se basará en parte en el número de filas que se deben leer las estimaciones del optimizador.

Por ejemplo, supongamos que tiene la siguiente consulta:

SELECT emp_id FROM employees WHERE months_of_service = 6;

(Los months_of_service columna tiene una restricción NOT NULL y un índice ordinario).

Hay dos planes básicos que el optimizador puede elegir aquí:

  • Plan 1:lea todas las filas de la tabla "empleados", para cada una, verifique si el predicado es verdadero (months_of_service=6 ).
  • Plan 2:Lea el índice donde months_of_service=6 (esto da como resultado un conjunto de ROWID), luego acceda a la tabla en función de los ROWID devueltos.

Imaginemos que la tabla "empleados" tiene 1 000 000 (1 millón) de filas. Imaginemos además que los valores de months_of_service oscilan entre 1 y 12 y se distribuyen de manera bastante uniforme por algún motivo.

El costo del Plan 1 , que implica un FULL SCAN, será el costo de leer todas las filas de la tabla de empleados, que es aproximadamente igual a 1.000.000; pero dado que Oracle a menudo podrá leer los bloques mediante lecturas de varios bloques, el costo real será menor (dependiendo de cómo esté configurada su base de datos), p. imaginemos que el recuento de lecturas de bloques múltiples es 10:el costo calculado del escaneo completo será 1,000,000 / 10; Costo total =100 000.

El costo del Plan 2 , que implica un ESCANEO DE RANGO DE ÍNDICE y una búsqueda de tabla por ROWID, será el costo de escanear el índice, más el costo de acceder a la tabla por ROWID. No entraré en cómo se calculan los costos de los escaneos de rango de índice, pero imaginemos que el costo del escaneo de rango de índice es 1 por fila; esperamos encontrar una coincidencia en 1 de cada 12 casos, por lo que el costo de la exploración del índice es 1 000 000 / 12 =83 333; más el costo de acceder a la tabla (suponga que se lee 1 bloque por acceso, no podemos usar lecturas de múltiples bloques aquí) =83,333; Costo total =166 666.

Como puede ver, el costo del Plan 1 (escaneo completo) es MENOR que el costo del Plan 2 (escaneo de índice + acceso por ID de fila), lo que significa que la CBO elegiría el escaneo COMPLETO.

Si las suposiciones hechas aquí por el optimizador son ciertas, entonces, de hecho, el Plan 1 será preferible y mucho más eficiente que el Plan 2, lo que desmiente el mito de que los escaneos COMPLETOS son "siempre malos".

Los resultados serían bastante diferentes si el objetivo del optimizador fuera FIRST_ROWS(n) en lugar de ALL_ROWS, en cuyo caso el optimizador preferiría el Plan 2 porque a menudo devolverá las primeras filas más rápido, a costa de ser menos eficiente para toda la consulta. .