¿Cómo usar Explain Plan para optimizar las consultas?

Me han encargado que optimice algunas consultas sql en el trabajo. Todo lo que he encontrado apunta a usar Explicar Plan para identificar áreas problemáticas. El problema no puedo averiguar exactamente qué es lo que explica el plan. Obtienes Costo, Cardinalidad y bytes.

¿Qué indica esto y cómo debería usar esto como guía? ¿Son mejores los numbers bajos? ¿Mucho mejor? Cualquier contribución será muy apreciada.

O si tiene una mejor forma de optimizar una consulta, me interesaría.

Obtienes más que eso en realidad dependiendo de lo que estás haciendo. Echa un vistazo a esta página de explicaciones del plan . Supongo un poco que está usando Oracle y sabe cómo ejecutar el script para mostrar el resultado del plan. Para empezar, puede ser más importante search en el lado izquierdo el uso de un índice en particular o no y cómo se está utilizando ese índice. Debería ver cosas como "(Completo)", "(Por Index Rowid)", etc., si está realizando uniones. El costo sería lo siguiente a tener en count, ya que los costos más bajos son mejores y notará que si realiza una unión que no utiliza un índice, puede get un costo muy elevado. También puede leer detalles sobre las columnas del plan de explicación .

También supongo que estás usando Oracle. Y también le recomiendo que consulte la página web del plan de explicación, para empezar. Hay mucho para la optimization, pero se puede aprender.

A continuación, algunos consejos:

En primer lugar, cuando alguien te asigna tareas de optimization, casi siempre buscan un performance aceptable en lugar de un performance máximo. Si puede networkingucir el time de ejecución de una consulta de 3 minutos a 3 segundos, no se preocupe networkinguciéndolo a 2 segundos, hasta que se lo pidan.

En segundo lugar, haga una comprobación rápida para asegurarse de que las consultas que está optimizando sean lógicamente correctas. Parece absurdo, pero no puedo decirte la cantidad de veces que me han pedido consejo sobre una consulta de ejecución lenta, ¡solo para descubrir que de vez en cuando daba respuestas incorrectas! Y como resultado, la debugging de la consulta a menudo resultó para acelerarlo también.

En particular, busque la frase "Unión cartesiana" en el plan de explicación. Si lo ves allí, es muy probable que encuentres una unión cartesiana no intencional. El patrón habitual para una unión cartesiana involuntaria es que la cláusula FROM enumera tablas separadas por comas, y las condiciones de unión están en la cláusula WHERE. Excepto que falta una de las condiciones de unión, por lo que Oracle no tiene más remedio que realizar una unión cartesiana. Con tablas grandes, este es un desastre de performance.

Es posible ver una unión cartesiana en el plan de explicación donde la consulta es lógicamente correcta, pero la asocio con versiones anteriores de Oracle.

Busque también el índice compuesto no usado. Si la primera columna de un índice compuesto no se utiliza en la consulta, Oracle puede usar el índice de manera ineficiente o no utilizarlo en absoluto. Déjame dar un ejemplo:

La consulta fue:

select * from customers where State = @State and ZipCode = @ZipCode 

(El DBMS no era Oracle, por lo que la syntax era diferente y olvidé la syntax original).

Un vistazo rápido a los índices reveló un índice en Clientes con las columnas (País, Estado, Código postal) en ese order. Cambié la consulta para leer

  select * from customers where Country = @Country and State = @State and ZipCode = @ZipCode 

y ahora funcionó en aproximadamente 6 segundos en lugar de aproximadamente 6 minutos, porque el optimizador pudo usar el índice con una buena ventaja. Le pregunté a los progtwigdores de aplicaciones por qué habían omitido el país de los criterios, y esta fue su respuesta: sabían que todas las direcciones tenían un país igual a 'EE. UU', ¡así que pensaron que podían acelerar la consulta dejando fuera ese criterio!

Desafortunadamente, optimizar la recuperación de la database no es lo mismo que afeitar microsegundos fuera del time de computación. Implica comprender el layout de la database, especialmente los índices, y al less una visión general de cómo el optimizador hace su trabajo.

Generalmente obtiene mejores resultados del optimizador cuando aprende a queueborar con él en lugar de tratar de ser más astuto.

¡Buena suerte para acelerar en la optimization!

Tienes el final borroso de la piruleta.

No hay forma de que, de manera aislada, sin mucha información adicional y experiencia, observe un plan de explicación y determine qué (si acaso) está causando un performance inferior al óptimo. Si el ajuste de consultas se pudiera networkingucir a un process de 10 pasos, se realizaría mediante un process automático. Estaba a punto de enumerar todas las cosas que necesita entender para ser efectivo en esto, pero esa sería una list muy larga.

la única respuesta corta en la que puedo pensar … es search pasos en el plan que estén atravesando más bytes de los que imaginaba. Luego, piense cómo puede networkingucir ese número … a través de un índice o una partición.

En serio, consiga el libro de Jonathan sobre los fundamentos del costo basado en Oracle

Obtenga el libro de Tom Kyte sobre Oracle Database Architecture y alquile una cabaña en el bosque por unas semanas.

Este es un área masiva de conocimiento (también conocido como arte negro).

El enfoque que generalmente tomo es:

  1. Ejecute la statement SQL en cuestión,
  2. Obtenga el plan real (busque dbms_xplan),
  3. Compare el número estimado de filas (cardinalidad) con el número real de filas. Una gran diferencia indica un problema que debe solucionarse (por ejemplo, índice, histogtwig)
  4. Considere si puede crear un índice para acelerar parte del process (en general, donde conceptualmente piensa que el plan debe ir primero). Pruebe algunos índices.

Necesita comprender los impactos O () de diferentes índices en el context de lo que está pidiendo a la database. Le ayuda a comprender estructuras de datos como b-trees, tablas hash, etc. Luego, cree un índice que pueda funcionar y repita el process.

Si Oracle decide no usar su índice, aplique una sugerencia INDEX () y observe el nuevo plan. El costo será mayor que el plan que eligió; esta es la razón por la que no eligió su índice. El plan sugerido podría conducir a una idea de por qué su índice no es bueno.