F.3. auto_explain — registrar planes de ejecución de consultas lentas #

F.3.1. Parámetros de configuración
F.3.2. Ejemplo
F.3.3. Autor

El módulo auto_explain proporciona un medio para registrar planes de ejecución de sentencias lentas de forma automática, sin tener que ejecutar EXPLAIN a mano. Esto es especialmente útil para rastrear consultas no optimizadas en aplicaciones grandes.

El módulo no proporciona funciones accesibles mediante SQL. Para usarlo, simplemente cárgalo en el servidor. Puedes cargarlo en una sesión individual:

LOAD 'auto_explain';

(Debes ser superusuario para hacer eso). El uso más típico es precargarlo en algunas o en todas las sesiones incluyendo auto_explain en session_preload_libraries o shared_preload_libraries en postgresql.conf. De este modo, podrás hacer un seguimiento de las consultas inesperadamente lentas sin importar cuándo ocurran. Por supuesto, esto tiene un coste en términos de sobrecarga informática (overhead).

F.3.1. Parámetros de configuración #

Existen varios parámetros de configuración que controlan el comportamiento de auto_explain. Ten en cuenta que el comportamiento por defecto es no hacer nada, por lo que debes configurar al menos auto_explain.log_min_duration si deseas obtener algún resultado.

auto_explain.log_min_duration (integer) #

auto_explain.log_min_duration es el tiempo mínimo de ejecución de la sentencia, en milisegundos, que hará que se registre el plan de la misma. Establecer esto en 0 registra todos los planes. -1 (el valor por defecto) desactiva el registro de los planes. Por ejemplo, si lo estableces en 250ms, se registrarán todas las sentencias que se ejecuten durante 250ms o más. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_parameter_max_length (integer) #

auto_explain.log_parameter_max_length controla el registro de los valores de los parámetros de la consulta. Un valor de -1 (el valor por defecto) registra los valores de los parámetros en su totalidad. 0 desactiva el registro de los valores de los parámetros. Un valor mayor que cero trunca cada valor de parámetro a esa cantidad de bytes. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_analyze (boolean) #

auto_explain.log_analyze hace que se imprima la salida de EXPLAIN ANALYZE, en lugar de solo la salida de EXPLAIN, cuando se registra un plan de ejecución. Este parámetro está desactivado por defecto. Solo los superusuarios pueden cambiar esta configuración.

Note

Cuando este parámetro está activado, se realiza la medición de tiempos por cada nodo del plan para todas las sentencias ejecutadas, se registren o no de forma efectiva. Esto puede tener un impacto extremadamente negativo en el rendimiento. Desactivar auto_explain.log_timing mitiga el coste de rendimiento, a cambio de obtener menos información.

auto_explain.log_buffers (boolean) #

auto_explain.log_buffers controla si se imprimen las estadísticas de uso de búferes cuando se registra un plan de ejecución; es equivalente a la opción BUFFERS de EXPLAIN. Este parámetro no tiene efecto a menos que auto_explain.log_analyze esté activado. Este parámetro está desactivado por defecto. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_wal (boolean) #

auto_explain.log_wal controla si se imprimen las estadísticas de uso de WAL cuando se registra un plan de ejecución; es equivalente a la opción WAL de EXPLAIN. Este parámetro no tiene efecto a menos que auto_explain.log_analyze esté activado. Este parámetro está desactivado por defecto. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_timing (boolean) #

auto_explain.log_timing controla si se imprime la información de tiempos por nodo cuando se registra un plan de ejecución; es equivalente a la opción TIMING de EXPLAIN. La sobrecarga de leer repetidamente el reloj del sistema puede ralentizar las consultas significativamente en algunos sistemas, por lo que puede ser útil desactivar este parámetro cuando solo se necesitan los conteos de filas reales y no los tiempos exactos. Este parámetro no tiene efecto a menos que auto_explain.log_analyze esté activado. Este parámetro está activado por defecto. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_triggers (boolean) #

auto_explain.log_triggers hace que se incluyan las estadísticas de ejecución de los disparadores (triggers) cuando se registra un plan de ejecución. Este parámetro no tiene efecto a menos que auto_explain.log_analyze esté activado. Este parámetro está desactivado por defecto. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_verbose (boolean) #

auto_explain.log_verbose controla si se imprimen detalles detallados (verbose) cuando se registra un plan de ejecución; es equivalente a la opción VERBOSE de EXPLAIN. Este parámetro está desactivado por defecto. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_settings (boolean) #

auto_explain.log_settings controla si se imprime información sobre las opciones de configuración modificadas cuando se registra un plan de ejecución. Solo se incluyen en la salida las opciones que afectan a la planificación de consultas con valores diferentes al valor por defecto integrado. Este parámetro está desactivado por defecto. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_format (enum) #

auto_explain.log_format selecciona el formato de salida de EXPLAIN a utilizar. Los valores permitidos son text, xml, json y yaml. El valor por defecto es text. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_level (enum) #

auto_explain.log_level selecciona el nivel de log en el que auto_explain registrará el plan de la consulta. Los valores válidos son DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING y LOG. El valor por defecto es LOG. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.log_nested_statements (boolean) #

auto_explain.log_nested_statements hace que se consideren para el registro las sentencias anidadas (sentencias ejecutadas dentro de una función). Cuando está desactivado, solo se registran los planes de consulta de nivel superior. Este parámetro está desactivado por defecto. Solo los superusuarios pueden cambiar esta configuración.

auto_explain.sample_rate (real) #

auto_explain.sample_rate hace que auto_explain solo analice una fracción de las sentencias en cada sesión. El valor por defecto es 1, lo que significa que se analizan todas las consultas. En caso de sentencias anidadas, o bien se analizan todas o ninguna. Solo los superusuarios pueden cambiar esta configuración.

En un uso habitual, estos parámetros se establecen en postgresql.conf, aunque los superusuarios pueden modificarlos sobre la marcha dentro de sus propias sesiones. Un uso típico podría ser:

# postgresql.conf
session_preload_libraries = 'auto_explain'

auto_explain.log_min_duration = '3s'

F.3.2. Ejemplo #

postgres=# LOAD 'auto_explain';
postgres=# SET auto_explain.log_min_duration = 0;
postgres=# SET auto_explain.log_analyze = true;
postgres=# SELECT count(*)
           FROM pg_class, pg_index
           WHERE oid = indrelid AND indisunique;

Esto podría producir una salida de log como:

LOG:  duration: 3.651 ms  plan:
  Query Text: SELECT count(*)
              FROM pg_class, pg_index
              WHERE oid = indrelid AND indisunique;
  Aggregate  (cost=16.79..16.80 rows=1 width=0) (actual time=3.626..3.627 rows=1.00 loops=1)
    ->  Hash Join  (cost=4.17..16.55 rows=92 width=0) (actual time=3.349..3.594 rows=92.00 loops=1)
          Hash Cond: (pg_class.oid = pg_index.indrelid)
          ->  Seq Scan on pg_class  (cost=0.00..9.55 rows=255 width=4) (actual time=0.016..0.140 rows=255.00 loops=1)
          ->  Hash  (cost=3.02..3.02 rows=92 width=4) (actual time=3.238..3.238 rows=92.00 loops=1)
                Buckets: 1024  Batches: 1  Memory Usage: 4kB
                ->  Seq Scan on pg_index  (cost=0.00..3.02 rows=92 width=4) (actual time=0.008..3.187 rows=92.00 loops=1)
                      Filter: indisunique

F.3.3. Autor #

Takahiro Itagaki