Supervisa el rendimiento de las consultas con las Estadísticas de consultas avanzadas

Selecciona una versión de la documentación:

Las estadísticas de consultas avanzadas te permiten detectar, diagnosticar y prevenir problemas de rendimiento de las consultas en tu base de datos de AlloyDB Omni. Captura la telemetría de la base de datos, incluidas las estadísticas de consultas normalizadas, los eventos de espera, las direcciones IP del cliente, las etiquetas y la carga de la instancia, y retiene las métricas históricas durante 30 días.

Puedes usar las estadísticas de consultas avanzadas para realizar las siguientes tareas:

  • Identificar consultas de latencia alta y con uso intensivo de recursos mediante el análisis del tiempo de ejecución, el tiempo de E/S, el tiempo de espera, la actividad del búfer compartido y los recuentos de filas
  • Solucionar problemas de cuellos de botella mediante la correlación de consultas lentas con eventos de espera y clases de eventos de espera
  • Realizar un seguimiento del rendimiento de las consultas a componentes específicos de la aplicación mediante el etiquetado de consultas con SQLCommenter.
  • Supervisar las consultas activas y las transacciones abiertas en tiempo real, y detener las sesiones problemáticas

Antes de comenzar

Antes de habilitar las estadísticas de consultas avanzadas, verifica los siguientes requisitos:

  • Ejecutas una instancia independiente de AlloyDB Omni instalada con paquetes RPM de Linux.

  • Tienes acceso de superusuario postgres a la instancia de base de datos y acceso de administrador para reiniciar el servicio de base de datos.

  • La base de datos alloydbadmin existe en tu instancia. AlloyDB Omni crea esta base de datos de forma predeterminada durante la inicialización.

Habilita las estadísticas de consultas avanzadas

Para habilitar las estadísticas de consultas avanzadas, sigue estos pasos:

  1. Conéctate a la base de datos postgres como el superusuario postgres:

    sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d postgres
  2. Verifica las bibliotecas cargadas en shared_preload_libraries, agrega estadísticas de consultas avanzadas a la lista de carga previa, habilita la extensión y sal de psql:

    SHOW shared_preload_libraries;
    ALTER SYSTEM SET shared_preload_libraries = 'LIBRARY_1','LIBRARY_2','google_insights_v2';
    ALTER SYSTEM SET google_insights_v2.enabled = on;
    \q
    

    Reemplaza LIBRARY_1, LIBRARY_2 y cualquier otra biblioteca existente adicional por los nombres de las bibliotecas que muestra SHOW shared_preload_libraries. Incluye cada entrada de biblioteca individual entre comillas simples, como 'g_stats','google_columnar_engine','google_insights_v2', e incluye todas las bibliotecas existentes que requiere AlloyDB Omni para no sobrescribirlas.

  3. Reinicia el servidor de AlloyDB Omni para aplicar la configuración de carga previa:

    sudo systemctl restart alloydbomni18
  4. Conéctate a la base de datos alloydbadmin como el superusuario postgres:

    sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d alloydbadmin
  5. Crea la extensión de estadísticas de consultas avanzadas en la base de datos alloydbadmin:

    CREATE EXTENSION IF NOT EXISTS google_insights_v2;
    
  6. Verifica que la biblioteca esté cargada, que la extensión esté habilitada y que la extensión google_insights_v2 esté instalada en alloydbadmin:

    SHOW shared_preload_libraries;
    SHOW google_insights_v2.enabled;
    SELECT extname, extversion FROM pg_extension WHERE extname = 'google_insights_v2';
    

    Confirma que shared_preload_libraries incluya google_insights_v2, google_insights_v2.enabled muestre on y que pg_extension muestre una fila para google_insights_v2.

Dimensiones y parámetros de capacidad

En AlloyDB Omni, las estadísticas de consultas avanzadas registran la telemetría de la base de datos en tablas, vistas y funciones de SQL en la base de datos alloydbadmin en las siguientes dimensiones y capacidades:

  • Consultas: Se usa para identificar instrucciones SQL lentas o con uso intensivo de recursos cuando aumenta la latencia de las consultas.
  • Tipos de eventos de espera: Se usa para determinar si la CPU, la E/S de disco o la contención de bloqueo causan cuellos de botella en la carga de trabajo.
  • Eventos de espera: Se usa para identificar el evento de espera específico de PostgreSQL, como DataFileRead o WALWrite, que retrasa la ejecución de la consulta.
  • Bases de datos: Se usa para comparar el consumo de recursos en bases de datos lógicas y aislar bases de datos de carga alta en instancias compartidas.
  • Usuarios y direcciones IP del cliente: Se usa para atribuir la carga de consultas a roles de base de datos o direcciones IP del cliente específicos y para identificar clientes de aplicaciones problemáticos.
  • Etiquetas: Se usa para correlacionar la carga de la base de datos con servicios, rutas o acciones de ORM específicos de la aplicación etiquetados con SQLCommenter.
  • Consultas activas: Se usa para diagnosticar picos de rendimiento en vivo, transacciones bloqueadas y sesiones de larga duración en tiempo real.

Cuando configuras google_insights_v2.enabled como on, AlloyDB Omni recopila automáticamente métricas para consultas, tipos de eventos de espera, eventos de espera, bases de datos y usuarios.

Para actualizar cualquier parámetro google_insights_v2.* en el tiempo de ejecución sin reiniciar el servidor de base de datos, ejecuta ALTER SYSTEM SET y vuelve a cargar la configuración:

ALTER SYSTEM SET PARAMETER_NAME = VALUE;
SELECT pg_reload_conf();

Reemplaza lo siguiente:

  • PARAMETER_NAME: Es el nombre del parámetro de estadísticas de consultas avanzadas que se configurará, como google_insights_v2.qi_track_active_queries, google_insights_v2.qi_track_tag o google_insights_v2.qi_track_client_address.
  • VALUE: Es el valor nuevo del parámetro, como on.

Para obtener descripciones de cada parámetro, las vistas de observabilidad correspondientes y las métricas y columnas que muestra cada vista, consulta la referencia de estadísticas de consultas avanzadas.

Niveles de detalle de los datos temporales

Cada vista histórica observability_service_* está disponible en tres niveles de detalle de los datos temporales:

  • Vistas base (*_view): Intervalos de vaciado de 15 segundos. Usa estas vistas para investigar picos o incidentes recientes en las últimas 1 a 6 horas.
  • Vistas de nivel 1 aproximado (*_coarse_1_view): Intervalos agregados de 5 minutos para las 2,000 consultas principales. Usa estas vistas para analizar las tendencias de rendimiento en un período de 6 a 24 horas.
  • Vistas de nivel 2 aproximado (*_coarse_2_view): Intervalos agregados de 30 minutos para las 2,000 consultas principales. Usa estas vistas para analizar tendencias de varios días hasta el límite de retención de 30 días.

Las vistas históricas de observabilidad almacenan todas las columnas de tiempo de ejecución, espera y E/S en microsegundos, incluidas total_execution_time, total_wait_time, total_read_time, total_write_time y time_spent.

Consulta las métricas históricas de rendimiento de las consultas

Conéctate a la base de datos alloydbadmin para ejecutar consultas de diagnóstico en las vistas históricas de observabilidad. Para obtener más información, consulta Ejecuta AlloyDB Omni y conéctate a él.

Las sentencias de SQL de esta sección son consultas de ejemplo para situaciones comunes de solución de problemas en las dimensiones. Puedes personalizar estos ejemplos, como cambiar el período recorded_on, filtrar por bases de datos o roles específicos, o consultar *_coarse_1_view y *_coarse_2_view para realizar análisis de varios días, para que se adapten a tu carga de trabajo.

Identifica consultas de latencia alta

Para encontrar las 10 consultas normalizadas principales con el tiempo de ejecución total más alto en la última hora, ejecuta la siguiente consulta de ejemplo en google_insights_v2.observability_service_query_view:

SELECT
  query_id,
  database,
  username,
  left(query, 100) AS normalized_query,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us,
  sum(total_rows) AS total_rows,
  sum(total_shared_blocks_hit) AS shared_blocks_hit,
  sum(total_shared_blocks_read) AS shared_blocks_read
FROM google_insights_v2.observability_service_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY query_id, database, username, left(query, 100)
ORDER BY total_execution_time_us DESC
LIMIT 10;

Analiza los eventos de espera por consulta

Para identificar qué categorías de eventos de espera (wait_class) y eventos de espera detallados (wait_event) contribuyen con la mayor parte del tiempo de espera a un query_id específico, ejecuta la siguiente consulta de ejemplo en google_insights_v2.observability_service_wait_event_stats_by_query_view:

SELECT
  query_id,
  database,
  username,
  wait_class,
  wait_event,
  sum(count) AS wait_occurrences,
  sum(time_spent) AS total_wait_time_us
FROM google_insights_v2.observability_service_wait_event_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
  AND query_id = QUERY_ID
GROUP BY query_id, database, username, wait_class, wait_event
ORDER BY total_wait_time_us DESC;

Reemplaza QUERY_ID por el valor query_id que muestra observability_service_query_view.

Analiza la carga de la base de datos, el usuario y la IP del cliente

Para comparar el tiempo total de ejecución, el tiempo de espera y el volumen de consultas en bases de datos lógicas y roles de base de datos en la última hora, ejecuta la siguiente consulta de ejemplo en google_insights_v2.observability_service_db_load_conn_view:

SELECT
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  sum(total_wait_time) AS total_wait_time_us
FROM google_insights_v2.observability_service_db_load_conn_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY database, username
ORDER BY total_execution_time_us DESC;

Si habilitas google_insights_v2.qi_track_client_address, también puedes identificar qué direcciones IP del cliente conectadas generan la mayor parte del tiempo de consulta con la siguiente consulta de ejemplo en google_insights_v2.observability_service_client_address_stats_by_query_view:

SELECT
  client_address,
  username,
  database,
  query_id,
  sum(count) AS total_executions,
  sum(time_spent) AS total_time_spent_us
FROM google_insights_v2.observability_service_client_address_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY client_address, username, database, query_id
ORDER BY total_time_spent_us DESC
LIMIT 10;

Realiza un seguimiento del rendimiento de las consultas por etiquetas

Cuando google_insights_v2.qi_track_tag se establece en on y tus consultas incluyen SQLCommenter, ejecuta la siguiente consulta de ejemplo para agregar el tiempo de ejecución por metadatos de etiquetas de aplicación con google_insights_v2.observability_service_tag_view:

SELECT
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us
FROM google_insights_v2.observability_service_tag_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username
ORDER BY total_execution_time_us DESC
LIMIT 10;

Supervisa las consultas activas

Cuando configuras google_insights_v2.qi_track_active_queries como on, puedes supervisar las consultas en ejecución y las transacciones abiertas en tiempo real consultando google_insights_v2.stat_activity y google_insights_v2.stat_activity_v3 en la base de datos alloydbadmin.

Estas vistas exponen las conexiones de cliente activas, las duraciones de las sesiones y las transacciones, y los eventos de espera actuales, mientras excluyen los trabajadores en segundo plano y las conexiones alloydbadmin.

Consulta las sesiones activas y las duraciones de las transacciones

Para identificar qué consultas se están ejecutando de forma activa en la instancia en este momento y qué transacciones se han estado ejecutando durante más tiempo, ejecuta la siguiente consulta de ejemplo en alloydbadmin:

SELECT
  pid AS "Process ID",
  left(normalized_query, 40) AS "Query",
  state AS "Status",
  round(EXTRACT(EPOCH FROM (clock_timestamp() - backend_start))::numeric, 2) AS "Session duration (secs)",
  CASE
    WHEN xact_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - xact_start))::numeric, 2)
    ELSE NULL
  END AS "Transaction duration (secs)",
  CASE
    WHEN query_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - query_start))::numeric, 2)
    ELSE NULL
  END AS "Query duration (secs)",
  COALESCE(wait_event_type, '') AS "Wait event type",
  COALESCE(wait_event, '') AS "Wait event",
  database AS "Database",
  COALESCE(application_name, '') AS "Application name",
  username AS "Username",
  COALESCE(client_addr::text, '') AS "Client address"
FROM google_insights_v2.stat_activity_v3
WHERE state = 'active'
ORDER BY query_start ASC;

Detén una consulta o transacción de larga duración

Para detener una consulta de larga duración o una transacción bloqueada identificada en google_insights_v2.stat_activity_v3, pasa su ID de proceso a pg_terminate_backend:

SELECT pg_terminate_backend(PROCESS_ID);

Reemplaza PROCESS_ID por el valor Process ID (pid) que muestra google_insights_v2.stat_activity_v3.

Inhabilita las estadísticas de consultas avanzadas

Para detener la recopilación de telemetría sin reiniciar tu instancia de AlloyDB Omni, configura google_insights_v2.enabled como off y vuelve a cargar la configuración:

ALTER SYSTEM SET google_insights_v2.enabled = off;
SELECT pg_reload_conf();

Para quitar los objetos de extensión y los datos históricos almacenados de la base de datos alloydbadmin, conéctate a alloydbadmin y quita la extensión:

DROP EXTENSION IF EXISTS google_insights_v2 CASCADE;

¿Qué sigue?