sábado, 2 de junio de 2018

Entendiendo el plan de ejecución de una consulta SQL


Muchas veces tenemos problemas de performance y como unos campeones vamos a ver el plan de ejecución pero no entendemos nada :(

¿Qué debo buscar primero?

Todos los motores de bases de datos deberían indicar al menos dos cosas en el plan de ejecución sobre la consulta que estamos investigando:

  • Costo
  • Cantidad de registros

Es importante buscar el costo y la cantidad de registros en cada parte de la consulta porque nos va a dar una idea donde trabajar..

Depende de la herramienta que usen, es más fácil encontrar uno u otro, por ejemplo Oracle directamente en el EXPLAIN PLAN tenes la columna Cost y Rows.

En SQL Server, si vemos el plan de ejecución en el Management Studio podemos ver el Subtree Cost que es el acumulado de la tarea actual más todas las tareas anteriores que ejecutó (en esa rama). Además, el grosor de la flecha (viendo el plan gráficamente) muestra la cantidad de registros que se mueven en esa consulta.



¿Por qué hay un Sort en mi plan si no hago Order By en la query?

Usualmente esto puede suceder cuando el JOIN se resuelve con el algoritmo MERGE (o sort-merge join). En SQL Server se ve está manera:



El Sort es costoso cómo se ve, pero es peor que resolverlo con un “Loop”. Esto se soluciona con índices ya que con un índice, el ordenamiento es mucho más simple.

¿Que cosas NO deberían aparecer en el plan de ejecución?

En bases de datos relacionales (me refiero a las OLTP y no a los DW donde se hace adrede), no deberíamos jamás encontrarnos con un “Table Scan”. Si aparece un table scan, es porque esa tabla no tiene un Cluster Index (y probablemente tampoco una PK). Cuando las tablas no tienen un Cluster Index no se guardan de manera ordenada y por lo tanto, para hacer una búsqueda el motor se ve obligado a escanear la tabla entera.

¿La base está eligiendo el plan correcto?

Si pensas que existe la posibilidad de que la base no esté eligiendo el plan de ejecución correcto, es porque seguramente tenes que actualizar la estadísticas. No pretendan forzar a la base de datos a elegir un índice específico (aunque puedas hacerlo). Si la base no elige tu índice, seguro tiene un motivo.