¿Quiere saber por qué una consulta de PostgreSQL es lenta? Entonces EXPLAIN ANALYZE es un excelente punto de partida. Pero los planes de consulta pueden depender de otra actividad del servidor, pueden tardar un tiempo en ejecutarse y pueden cambiar con el tiempo, por lo que si desea ver los planes de ejecución reales de sus consultas más lentas, auto_explain es la herramienta que necesita. En esta publicación, veremos qué hace, cómo configurarlo y cómo usar esos registros para acelerar sus consultas.
¿Qué es auto_explain?
auto_explain es una extensión de PostgreSQL que le permite registrar los planes de consulta para consultas más lentas que un umbral (configurable). Esto es increíblemente útil para depurar consultas lentas, especialmente aquellas que solo a veces son problemáticas. Es uno de los módulos de contribución, por lo que se puede instalar y configurar fácilmente en PostgreSQL normal, y es tan útil que lo tenemos activado de forma predeterminada en ScaleGrid.
Muchas gracias a Takahiro Itagaki, el autor principal detrás de la primera versión de auto_explain (commit, thread), Dean Rasheed, en cuyo parche inicial y sugerencia se basó, y a los muchos colaboradores y revisores desde entonces.
¿Qué parámetros de explicación automática debo usar?
A continuación, analizaremos los parámetros más importantes, pero revise la tabla a continuación o la documentación oficial para obtener más información sobre la gama completa de cosas que puede rastrear.
El parámetro más importante para auto_explain es log_min_duration
. De forma predeterminada, esto se establece en -1
, lo que significa que no se registrará nada, por lo que si queremos algunos registros, ¡debemos cambiarlo! La unidad predeterminada es ms, por lo que una configuración de 100
registrará los planes de consulta para todas las consultas que superen los 100 ms. Esto es lo que elegimos por defecto en ScaleGrid, pero se puede configurar en Admin -> Config. Si, por algún motivo, desea registrar el plan de consulta para cada consulta, puede establecerlo en 0
– pero cuidado, esto puede tener graves implicaciones en el rendimiento.
Dado que las consultas ya se están ejecutando en el servidor, probablemente también desee habilitar auto_explain.log_analyze
. Esto hace que la salida sea equivalente a ejecutar EXPLAIN ANALYZE
. De forma predeterminada, también significa que se realiza un seguimiento de los tiempos por operación. Esto viene con una sobrecarga adicional, que se puede minimizar desactivando auto_explain.log_timing
(activado de forma predeterminada con log_analyze
). Sin embargo, naturalmente, los tiempos por operación son muy útiles cuando se depuran consultas lentas. Nuestras pruebas internas mostraron gastos generales aceptables para esto, por lo que está activado de forma predeterminada en ScaleGrid, pero como siempre, pruebe su carga de trabajo para ver si los gastos generales son aceptables en su caso. Actualmente, hay información disponible públicamente limitada sobre este tema, pero una publicación reciente del equipo de pgMustard mostró que, al menos en una carga de trabajo transaccional pequeña, la sobrecarga puede ser tan baja como 2%. Como señalaron, esto podría reducirse con el auto_explain.sample_rate
parámetro, a costa de solo rastrear un subconjunto de sus consultas.
El parámetro final que discutiremos con un poco de detalle es auto_explain.log_format
. La salida predeterminada es TEXTO, que es probablemente con lo que está más familiarizado al usar EXPLAIN
.
Este es un ejemplo simple de cómo puede verse la salida de auto_explain en formato de TEXTO:
2021-09-10 15:32:04.606 BST [22770] LOG: duration: 3184.383 ms plan: Query Text: select * from table1 order by column1; Sort (cost=12875.92..13125.92 rows=100000 width=37) (actual time=2703.799..3055.401 rows=100000 loops=1) Sort Key: column1 Sort Method: external merge Disk: 4696kB Buffers: shared hit=837, temp read=587 written=589 -> Seq Scan on table (cost=0.00..1834.01 rows=100000 width=37) (actual time=0.033..27.795 rows=100000 loops=1) Buffers: shared hit=834
Puede ver aquí que obtiene la duración de la consulta al principio, que puede estar acostumbrado a ver al final de los planes de consulta por lo general. También verá el texto de la consulta, incluidos los parámetros.
Las populares herramientas de visualización Explain.depesz y Explain.dalibo aceptan planes de consulta en formato TEXT, pero también admiten el formato JSON. Si algunos miembros de su equipo prefieren usar herramientas como PEV y pgMustard, que solo admiten el formato JSON, es posible que desee establecer ese formato. Para los clientes de ScaleGrid, optamos por el formato JSON, en parte porque queríamos analizarlo más fácilmente para nuestra propia función de análisis de consultas lentas.
Aquí hay una lista completa de los parámetros de auto_explain y sus valores predeterminados:
Parámetro | Valores predeterminados de PostgreSQL | Valores predeterminados de ScaleGrid |
---|---|---|
auto_explain.log_min_duration | -1 | 100 |
auto_explain.log_analyze | Desactivado | Activado |
auto_explain.log_timing | Activado (con log_analyze) | Activado |
auto_explain.log_buffers | Desactivado | Activado |
auto_explain.log_verbose | Desactivado | Activado |
auto_explain.log_triggers | Desactivado | Desactivado |
auto_explain.log_nested_statements | Desactivado | Desactivado |
auto_explain.log_settings (v12) | Desactivado | Desactivado |
auto_explain.log_wal (v13) | Desactivado | Desactivado |
auto_explain.log_format | TEXTO | JSON |
auto_explain.log_level | REGISTRO | REGISTRO |
auto_explain.sample_rate | 1 | 1 |
Instalando auto_explain
En ScaleGrid, auto_explain está activado de forma predeterminada, con un umbral de 100 ms. Puede configurar esto en Admin -> Config.
En PostgreSQL estándar, puede instalar auto_explain simplemente agregándolo a una de las session_preload_libraries
o shared_preload_libraries
. El primero tiene las ventajas de a) no requerir un reinicio (pero solo se cargará en nuevas sesiones) yb) permite habilitarlo solo para algunos usuarios (estableciendo este parámetro con ALTER ROLE SET
).
Como tal, una configuración básica para auto_explain podría verse así:
session_preload_libraries = auto_explain auto_explain.log_min_duration = 100 auto_explain.log_analyze = true auto_explain.log_buffers = true auto_explain.log_format = JSON
Si está utilizando un proveedor de alojamiento diferente, vale la pena verificar si es compatible con auto_explain. Por ejemplo, RDS Postgres lo hace, pero a diferencia de ScaleGrid, está desactivado de forma predeterminada, por lo que deberá editar la configuración para que funcione.
Cargando auto_explain en una sola sesión
Si no desea que auto_explain se ejecute automáticamente en las sesiones, como superusuario también tiene la opción de cargarlo en una única sesión:
LOAD 'auto_explain';
Esto puede ser increíblemente útil para sesiones de depuración únicas, pero, naturalmente, no es necesario si ya puede tenerlo en ejecución.
auto_explain limitaciones y errores
Ya hemos mencionado algunos de estos de pasada, pero parece un buen momento para recordar algunas de las desventajas y limitaciones de auto_explain.
En primer lugar, especialmente cuando se realiza un seguimiento de los tiempos por operación, puede haber una sobrecarga medible al usar auto_explain. Puede ser bajo, incluso si se miden los tiempos, pero como siempre, vale la pena hacer sus propias pruebas.
En segundo lugar, los tiempos de auto_explain son exclusivos del tiempo de planificación de consultas. El tiempo de planificación suele ser mínimo en consultas lentas, pero en casos excepcionales, puede ser responsable de la mayor parte del problema. Como tal, tenga en cuenta que es posible que estos casos no se muestren en sus registros o, si lo hacen, una discrepancia con lo que está viendo en la latencia total podría tener que ver con el tiempo de planificación. Un manual EXPLAIN ANALYZE
te ayudará rápidamente a detectar esto.
Cómo usar el resultado de explicación para acelerar las consultas
Una vez que tenga el resultado explicativo para sus consultas más lentas, ¡puede comenzar a buscar acelerarlas!
Tendrá que obtener los planes de consulta de los registros, para lo cual puede usar pgBadger si no está usando un servicio administrado que lo haga por usted.
Revisar los planes de EXPLAIN es un tema enorme por derecho propio. La documentación de PostgreSQL incluye una buena pero breve introducción al uso de EXPLAIN, y el artículo de Thoughbot sobre la lectura de EXPLAIN ANALYZE es un buen próximo paso. Si prefiere una charla de una hora, EXPLICAR explicado por Josh Berkus fue excelente. Para obtener más información, Depesz tiene una serie de publicaciones llamadas Explicando lo inexplicable y el equipo de pgMustard tiene un Glosario EXPLAIN bastante completo.
Si necesita ayuda de expertos en PostgreSQL para administrar sus bases de datos y acelerar sus consultas lentas, pruebe ScaleGrid. Brindamos soporte gratuito de nivel empresarial las 24 horas del día, los 7 días de la semana, que puede guiarlo a través de estas consultas lentas y ayudarlo a optimizarlas todas. Nuestra prueba gratuita de 30 días le brinda mucho tiempo para probar nuestras muchas funciones para PostgreSQL y nuestras otras bases de datos compatibles.
Esperamos que esto le brinde todo lo que necesita para comenzar con auto_explain y comenzar a acelerar cualquier consulta lenta que tenga. Si hay algo más que le gustaría saber, póngase en contacto.