¿Cómo se obtiene el plan de explicación?


10

¿Alguien puede explicar un poco sobre el plan de explicación y cómo se obtiene el plan de explicación para una consulta? Además, si hay algún script sql que se pueda utilizar como utilidad para esto, sería genial.


1
"si hay algún script sql que pueda usarse como utilidad para esto" ¿qué tipo de utilidad está buscando?
Derek Downey

2
Muchas herramientas de desarrollo SQL tienen interfaces gráficas de usuario muy fáciles de usar para obtener planes de ejecución. Oracle SQL Developer tiene uno. ¿Tiene acceso a alguna de estas herramientas o desea hacerlo específicamente desde los scripts?
FrustratedWithFormsDesigner

Tengo Oracle SQL Developer pero me gustaría conocer los scripts.
user419534

2
Si ha seguido un curso con Jonathan Lewis , sabrá que hay algo así como 8 formas diferentes de obtener un plan de ejecución de Oracle. Vota este comentario si quieres que agregue una respuesta que enumere todos los diferentes métodos.
Colin 't Hart

Respuestas:


9

Puede usar el paquete DBMS_XPLAN :

SQL> explain plan for select * from dual;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |     2 |     2 |
|   1 |  TABLE ACCESS FULL   | DUAL        |     1 |     2 |     2 |
--------------------------------------------------------------------
Note: cpu costing is off

5

La instrucción EXPLAIN PLAN muestra los planes de ejecución elegidos por el optimizador para las instrucciones SELECT, UPDATE, INSERT y DELETE. Un plan de ejecución de la declaración es la secuencia de operaciones que realiza la base de datos para ejecutar la declaración.

EXPLAIN PLAN FOR ...

Reemplace el ... con su instrucción SQL. Después de ejecutar esto, ejecute lo siguiente para ver el plan:

SELECT * FROM table(dbms_xplan.display);

Para obtener más información, consulte las secciones Descripción general o Uso en la Guía de ajuste de rendimiento de Oracle 11g.


1

Esta es una pregunta muy común, así que decidí convertir esta respuesta en un artículo .

El plan de ejecución SQL estimado

El optimizador genera el plan de ejecución estimado sin ejecutar la consulta SQL. Puede generar el plan de ejecución estimado desde cualquier cliente SQL usando EXPLAIN PLAN FOR o puede usar Oracle SQL Developer para esta tarea.

EXPLIQUE PLAN PARA

Al usar Oracle, si antepone el EXPLAIN PLAN FORcomando a una consulta SQL dada, la base de datos almacenará el plan de ejecución estimado en el asociado PLAN_TABLE:

EXPLAIN PLAN FOR
SELECT p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Para ver el plan de ejecución estimado, debe usar DBMS_XPLAN.DISPLAY, como se ilustra en el siguiente ejemplo:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))

La opción de formato ALL + OUTLINE le permite obtener más detalles sobre el plan de ejecución estimado que utilizar la opción de formato predeterminada.

Oracle SQL Developer

Si ha instalado SQL Developer, puede obtener fácilmente el plan de ejecución estimado para cualquier consulta SQL sin tener que anteponer el comando EXPLAIN PLAN FOR:

ingrese la descripción de la imagen aquí

El plan de ejecución de SQL real

El optimizador genera el plan de ejecución SQL real cuando ejecuta la consulta SQL. Entonces, a diferencia del Plan de ejecución estimado, debe ejecutar la consulta SQL para obtener su plan de ejecución real.

El plan real no debe diferir significativamente del estimado, siempre que la base de datos relacional subyacente haya recopilado adecuadamente las estadísticas de la tabla.

Sugerencia de consulta GATHER_PLAN_STATISTICS

Para indicar a Oracle que almacene el plan de ejecución real para una consulta SQL dada, puede usar la GATHER_PLAN_STATISTICSsugerencia de consulta:

SELECT /*+ GATHER_PLAN_STATISTICS */
  p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Para visualizar el plan de ejecución real, puede usar DBMS_XPLAN.DISPLAY_CURSOR:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))

Habilite ESTADÍSTICAS en el nivel de conexión DB

Si desea obtener los planes de ejecución para todas las consultas generadas dentro de una sesión determinada, puede establecer la configuración de la STATISTICS_LEVELsesión en ALL:

ALTER SESSION SET STATISTICS_LEVEL='ALL'

Esto tendrá el mismo efecto que configurar la GATHER_PLAN_STATISTICSsugerencia de consulta en cada consulta de ejecución. Entonces, al igual que con la GATHER_PLAN_STATISTICSsugerencia de consulta, puede usar DBMS_XPLAN.DISPLAY_CURSORpara ver el plan de ejecución real.

Debe restablecer la STATISTICS_LEVELconfiguración al modo predeterminado una vez que haya terminado de recopilar los planes de ejecución que le interesaban. Esto es muy importante, especialmente si está utilizando la agrupación de conexiones y las conexiones de la base de datos se reutilizan.

ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.