EXPLAIN y EXPLAIN ANALYZE
Estas dos herramientas son la base principal al momento de buscar los problemas de rendimiento de las consultas que realizamos, a pesar de su utilidad no son algo nuevo ya que han estado incluidos en PostgreSQL desde sus primeros años, pero esto no significa que sean obsoletos o anticuados, al contrario, han ido madurando hasta convertirse en una herramienta capaz de arrojar los reportes más detallados sobre la ejecución de los query, inclusive los resultados arrojados por la herramienta los podemos sacar en formatos como XML o JSON para su posterior análisis con otras herramientas.
En pgAdmin tenemos disponible una opción para obtener un gráfico del resultado de EXPLAIN de forma que en vez de estar analizando números podemos ver un gráfico y de esta forma más sencilla detectar los problemas de la consulta y las oportunidades de mejora.
Diferencias entre EXPLAIN y EXPLAIN ANALYZE
Tal vez ambos términos sean utilizados como si fuese la misma cosa, pero entre ellos tenemos diferencias, por ejemplo EXPLAIN nos da una idea de cómo el planificador de query piensa ejecutar la consulta, sin embargo no la ejecuta, en cambio EXPLAIN ANALYZE si la ejecuta y nos da una comparativa entre el rendimiento esperado y el rendimiento real obtenido en la ejecución. Al lanzar EXPLAIN vía pgAdmin podemos elegir entre EXPLAIN y EXPLAIN ANALYZE, lo cual nos dará el resultado de cada uno según los seleccionemos
Veamos un ejemplo de cómo utilizar esta herramienta, para ello vamos a valernos de EXPLAIN ANALYZE, veamos el siguiente código:
EXPLAIN ANALYZE SELECT left(tract_id,5) As county_code, SUM(hispanic_or_latino) As tot , SUM(white_alone) As tot_white , SUM(coalesce(hispanic_or_latino,0) - coalesce(white_alone,0)) AS non_white FROM census.hisp_pop GROUP BY county_code ***** BY county_code;
Es una consulta muy sencilla donde hacemos sumas de campos, agrupamos y ordenamos según uno de los campos, lo que obtendremos como resultado del análisis de rendimiento será lo siguiente:
GroupAggregate (cost=111.29..151.93 rows=1478 width=20) (actual time=6.099..10.194 rows=14 loops=1) -> Sort (cost=111.29..114.98 rows=1478 width=20) (actual time=5.897..6.565 rows=1478 loops=1) Sort Key: ("left"((tract_id)::text, 5)) Sort Method: quicksort Memory: 136kB -> Seq Scan on hisp_pop (cost=0.00..33.48 rows=1478 width=20) (actual time=0.390..2.693 rows=1478 loops=1) Total runtime: 10.370 ms
Si ponemos un poco de esfuerzo en la lectura, los resultados poco a poco nos van siendo más fáciles de leer, sin embargo si no tenemos mucho tiempo o el resultado es muy extenso siempre podemos ver el gráfico.
Como vemos es más rápido de ver los resultados a nivel gráfico, lo ideal es utilizar ambas herramientas y complementar ambos puntos de vista, es la misma información solo que con diferentes ángulos, habrán puristas que solo desean trabajar con la consola de comandos y está bien, sin embargo un profesional integral de bases de datos debe utilizar todas las herramientas a su disposición en pro de mejorar su trabajo.
Con esto finalizamos el tutorial, con el uso de estas herramientas ya estaremos en posición de detectar las causas que hacen que nuestras consultas no sean rápidas o las oportunidades de mejora para optimizar nuestro query.