Consultar estadísticas

Spanner proporciona tablas integradas que conservan muchas estadísticas de las consultas y las instrucciones del lenguaje de manipulación de datos (DML) que han usado la mayor cantidad de CPU, así como todas las consultas agregadas (incluidas las consultas de flujo de cambios).

Acceder a las estadísticas de consultas

.

Spanner proporciona las estadísticas de las consultas en el esquema SPANNER_SYS. Puedes acceder a los datos de SPANNER_SYS de las siguientes formas:

Los siguientes métodos de lectura única que proporciona Spanner no admiten SPANNER_SYS:

  • Realizar una lectura fuerte desde una sola fila o varias filas en una tabla.
  • Realizar una lectura inactiva de una sola fila o varias filas en una tabla.
  • Leer desde una sola fila o varias filas en un índice secundario.

Para obtener más información, consulta Métodos de lectura única.

Uso de CPU agrupado por consulta

En las siguientes tablas se registran las consultas con el mayor uso de CPU durante un periodo específico:

  • SPANNER_SYS.QUERY_STATS_TOP_MINUTE: consultas durante intervalos de 1 minuto
  • SPANNER_SYS.QUERY_STATS_TOP_10MINUTE: consultas durante intervalos de 10 minutos.
  • SPANNER_SYS.QUERY_STATS_TOP_HOUR: consultas durante intervalos de 1 hora

Estas tablas tienen las siguientes propiedades:

  • Cada tabla contiene datos de intervalos de tiempo no superpuestos de la duración que se especifica en el nombre de la tabla.

  • Los intervalos se basan en la hora del reloj. Los intervalos de 1 minuto terminan en el minuto, los intervalos de 10 minutos terminan cada 10 minutos a partir de la hora en punto y los intervalos de 1 hora terminan a la hora en punto.

    Por ejemplo, a las 11:59:30, los intervalos más recientes disponibles para las consultas SQL son los siguientes:

    • 1 minuto: de 11:58:00 a 11:58:59
    • 10 minutos: de 11:40:00 a 11:49:59
    • 1 hora: de 10:00:00 a 10:59:59
  • Spanner agrupa las estadísticas por el texto de la consulta de SQL. Si una consulta usa parámetros de consulta, Spanner agrupa todas las ejecuciones de esa consulta en una fila. Si la consulta usa literales de cadena, Spanner solo agrupa las estadísticas si el texto completo de la consulta es idéntico. Si el texto es diferente, cada consulta aparece en una fila independiente. En el caso de las DML por lotes, Spanner normaliza el lote deduplicando las instrucciones idénticas consecutivas antes de generar la huella digital.

  • Si hay una etiqueta de solicitud, FPRINT es el hash de la etiqueta de solicitud. De lo contrario, es el hash del valor TEXT. En el caso de las DMLs con particiones, FPRINT siempre es el hash del valor TEXT.

  • Cada fila contiene estadísticas de todas las ejecuciones de una consulta SQL concreta de las que Spanner registra estadísticas durante el intervalo especificado.

  • Si Spanner no puede almacenar todas las consultas ejecutadas durante el intervalo, el sistema prioriza las consultas con el mayor uso de CPU durante el intervalo especificado.

  • Las consultas monitorizadas incluyen las que se han completado, las que han fallado o las que ha cancelado el usuario.

  • Un subconjunto de estadísticas es específico de las consultas que se ejecutaron, pero no se completaron:

    • Número de ejecuciones y latencia media en segundos de todas las consultas que no se han completado correctamente.

    • Número de ejecuciones de consultas cuyo tiempo de espera se ha agotado.

    • Número de ejecuciones de consultas que el usuario ha cancelado o que no se han podido completar debido a problemas de conectividad de red.

  • Todas las columnas de las tablas admiten valores nulos.

Las estadísticas de las consultas de las instrucciones de DML particionado ejecutadas anteriormente tienen las siguientes propiedades:

  • Cada declaración de DML particionado que se ejecute correctamente se contabiliza como una ejecución. Una instrucción DML particionada que ha fallado, se ha cancelado o se está ejecutando tiene un recuento de ejecuciones igual a cero.

  • No se registran estadísticas de ALL_FAILED_EXECUTION_COUNT, ALL_FAILED_AVG_LATENCY_SECONDS, CANCELLED_OR_DISCONNECTED_EXECUTION_COUNT y TIMED_OUT_EXECUTION_COUNT para las DMLs particionadas.

  • Las estadísticas de cada instrucción DML con particiones ejecutada anteriormente pueden aparecer en intervalos diferentes. SPANNER_SYS.QUERY_STATS_TOP_10MINUTE y SPANNER_SYS.QUERY_STATS_TOP_HOUR proporcionan una vista agregada de las instrucciones DML particionadas que se completan en 10 minutos y 1 hora, respectivamente. Para ver las estadísticas de las instrucciones cuya duración sea superior a 1 hora, consulta el ejemplo de consulta.

Esquema de tabla

Nombre de la columna Tipo Descripción
INTERVAL_END TIMESTAMP Final del intervalo de tiempo en el que se produjeron las ejecuciones de consultas incluidas.
REQUEST_TAG STRING Etiqueta de solicitud opcional para esta operación de consulta. Para obtener más información sobre el uso de etiquetas, consulta el artículo Solucionar problemas con etiquetas de solicitud.
QUERY_TYPE STRING Indica si una consulta es PARTITIONED_QUERY o QUERY. Una PARTITIONED_QUERY es una consulta con un partitionToken obtenido de la API PartitionQuery o una declaración de DML particionado. Todas las demás consultas y las instrucciones DML se denotan con el tipo de consulta QUERY.
TEXT STRING Texto de la consulta SQL, truncado a aproximadamente 64 KB.

Las estadísticas de varias consultas que tienen la misma cadena de etiqueta se agrupan en una sola fila con la REQUEST_TAG coincidencia de esa cadena de etiqueta. En este campo solo se muestra el texto de una de esas consultas, que se trunca a aproximadamente 64 KB. En el caso de las DML por lotes, el conjunto de instrucciones SQL se acopla en una sola fila, que se concatena mediante un delimitador de punto y coma. Los textos SQL idénticos consecutivos se desduplican antes de truncarse.
TEXT_TRUNCATED BOOL Indica si el texto de la consulta se ha truncado o no.
TEXT_FINGERPRINT INT64 El hash del valor REQUEST_TAG, si está presente. De lo contrario, el hash del valor TEXT. Corresponde al campo query_fingerprint del registro de auditoría.
EXECUTION_COUNT INT64 Número de veces que Spanner ha visto la consulta durante el intervalo.
AVG_LATENCY_SECONDS FLOAT64 Duración media, en segundos, de cada ejecución de consulta en la base de datos. Este promedio no incluye el tiempo de codificación y transmisión del conjunto de resultados, ni tampoco la sobrecarga.
AVG_ROWS FLOAT64 Número medio de filas que ha devuelto la consulta.
AVG_BYTES FLOAT64 Número medio de bytes de datos que ha devuelto la consulta, sin incluir la sobrecarga de codificación de transmisión.
AVG_ROWS_SCANNED FLOAT64 Número medio de filas que ha analizado la consulta, sin incluir los valores eliminados.
AVG_CPU_SECONDS FLOAT64 Número medio de segundos de tiempo de CPU que Spanner ha dedicado a todas las operaciones para ejecutar la consulta.
ALL_FAILED_EXECUTION_COUNT INT64 Número de veces que la consulta ha fallado durante el intervalo.
ALL_FAILED_AVG_LATENCY_SECONDS FLOAT64 Duración media, en segundos, de cada ejecución de consulta que ha fallado en la base de datos. Este promedio no incluye el tiempo de codificación y transmisión del conjunto de resultados, así como la sobrecarga.
CANCELLED_OR_DISCONNECTED_EXECUTION_COUNT INT64 Número de veces que el usuario ha cancelado la consulta o que ha fallado debido a una conexión de red interrumpida durante el intervalo.
TIMED_OUT_EXECUTION_COUNT INT64 Número de veces que la consulta ha agotado el tiempo de espera durante el intervalo.
AVG_BYTES_WRITTEN FLOAT64 Número medio de bytes escritos por la instrucción.
AVG_ROWS_WRITTEN FLOAT64 Número medio de filas modificadas por la instrucción.
STATEMENT_COUNT INT64 Suma de las declaraciones agregadas en esta entrada. En el caso de las consultas y el DML normales, es igual al recuento de ejecuciones. En el caso de las consultas DML por lotes, Spanner registra el número de instrucciones del lote.
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT INT64 Número de veces que se ha ejecutado la consulta como parte de una transacción de lectura y escritura. Esta columna te ayuda a determinar si puedes evitar las contenciones de bloqueo moviendo la consulta a una transacción de solo lectura.
LATENCY_DISTRIBUTION ARRAY<STRUCT>

Un histograma del tiempo de ejecución de la consulta. Los valores se miden en segundos.

La matriz contiene un solo elemento y tiene el siguiente tipo:
ARRAY<STRUCT<
  COUNT INT64,
  MEAN FLOAT64,
  SUM_OF_SQUARED_DEVIATION FLOAT64,
  NUM_FINITE_BUCKETS INT64,
  GROWTH_FACTOR FLOAT64,
  SCALE FLOAT64,
  BUCKET_COUNTS ARRAY<INT64>>>

Para obtener más información sobre los valores, consulta Distribución.

Para calcular la latencia del percentil a partir de la distribución, usa la función SPANNER_SYS.DISTRIBUTION_PERCENTILE(distribution, n FLOAT64), que devuelve el percentil n estimado. Para ver un ejemplo relacionado, consulta Buscar la latencia del percentil 99 de las consultas.

Para obtener más información, consulta Métricas de percentiles y de distribución.

AVG_MEMORY_PEAK_USAGE_BYTES FLOAT64

Durante la ejecución de una consulta distribuida, el uso máximo medio de memoria (en bytes).

Usa esta estadística para identificar qué consultas o tamaños de datos de tabla es probable que alcancen los límites de memoria.

AVG_MEMORY_USAGE_PERCENTAGE FLOAT64

Durante la ejecución de una consulta distribuida, el uso medio de memoria necesario (como porcentaje del límite de memoria permitido para esta consulta).

Esta estadística solo registra la memoria necesaria para que se ejecute la consulta. Algunos operadores usan memoria de almacenamiento en búfer adicional para mejorar el rendimiento. La memoria de almacenamiento en búfer adicional que se usa se puede ver en el plan de consulta, pero no se usa para calcular AVG_MEMORY_USAGE_PERCENTAGE porque se usa para la optimización y no es obligatoria.

Usa esta estadística para identificar las consultas que se acercan al límite de uso de memoria y que corren el riesgo de fallar si aumenta el tamaño de los datos. Para reducir el riesgo de que la consulta falle, consulta las prácticas recomendadas de SQL para optimizar estas consultas o divide la consulta en partes que lean menos datos.

AVG_QUERY_PLAN_CREATION_TIME_SECS FLOAT64

Tiempo medio de CPU en segundos empleado en la compilación de consultas, incluida la creación del tiempo de ejecución de la consulta.

Si el valor de esta columna es alto, usa consultas con parámetros.

AVG_FILESYSTEM_DELAY_SECS FLOAT64

Tiempo medio que la consulta dedica a leer del sistema de archivos o a estar bloqueada en la entrada/salida (E/S).

Usa esta estadística para identificar la posible latencia alta causada por la E/S del sistema de archivos. Para mitigar este problema, añade un índice o una cláusula STORING (GoogleSQL) o INCLUDE (PostgreSQL) a un índice que ya tengas.

AVG_REMOTE_SERVER_CALLS FLOAT64

Número medio de llamadas a servidores remotos (RPC) que ha completado la consulta.

Use esta estadística para identificar si diferentes consultas que analizan el mismo número de filas tienen un número de llamadas RPC muy diferente. La consulta con un valor de RPC más alto puede beneficiarse de la adición de un índice o de una cláusula STORING (GoogleSQL) o INCLUDE (PostgreSQL) a un índice ya creado.

AVG_ROWS_SPOOLED FLOAT64

Número medio de filas escritas en un disco temporal (no en memoria) por la instrucción de consulta.

Usa esta estadística para identificar consultas con una latencia potencialmente alta que consumen mucha memoria y no se pueden ejecutar en la memoria. Para mitigar este problema, cambia el orden de JOIN o añade un índice que proporcione un SORT obligatorio.

AVG_DISK_IO_COST FLOAT64

El coste medio de esta consulta en términos de carga de disco HDD de Spanner.

Usa este valor para comparar los costes de E/S de HDD relativos entre lecturas que ejecutes en la base de datos. Consultar datos en almacenamiento HDD conlleva un cargo en la capacidad de carga de disco HDD de la instancia. Un valor más alto indica que estás usando más carga de disco duro y que tu consulta puede ser más lenta que si se ejecutara en SSD. Además, si la carga del disco duro está al máximo de su capacidad, el rendimiento de tus consultas podría verse aún más afectado. Puedes monitorizar la capacidad total de carga del disco HDD de la instancia como porcentaje. Para añadir más capacidad de carga de disco HDD, puedes añadir más unidades de procesamiento o nodos a tu instancia. Para obtener más información, consulta Cambiar la capacidad de computación. Para mejorar el rendimiento de las consultas, también puedes mover algunos datos a SSD.

En el caso de las cargas de trabajo que consumen muchas operaciones de E/S de disco, te recomendamos que almacenes los datos a los que se accede con frecuencia en almacenamiento SSD. Los datos a los que se accede desde SSD no consumen la capacidad de carga del disco duro. Puedes almacenar tablas, columnas o índices secundarios selectivos en almacenamiento SSD según sea necesario, mientras que los datos a los que se acceda con poca frecuencia se pueden almacenar en almacenamiento HDD. Para obtener más información, consulta el artículo Introducción al almacenamiento por niveles.

EXECUTION_COUNT, AVG_LATENCY_SECONDS y LATENCY_DISTRIBUTION de las consultas fallidas incluyen las consultas que han fallado debido a una sintaxis incorrecta o que han encontrado un error transitorio, pero que se han completado al volver a intentarlo. Estas estadísticas no registran las declaraciones de DML particionado fallidas ni canceladas.

Estadísticas agregadas

También hay tablas que registran datos agregados de todas las consultas de las que Spanner ha recogido estadísticas en un periodo concreto:

  • SPANNER_SYS.QUERY_STATS_TOTAL_MINUTE: consultas durante intervalos de 1 minuto
  • SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE: consultas durante intervalos de 10 minutos.
  • SPANNER_SYS.QUERY_STATS_TOTAL_HOUR: consultas durante intervalos de 1 hora

Estas tablas tienen las siguientes propiedades:

  • Cada tabla contiene datos de intervalos de tiempo no superpuestos de la duración que se especifica en el nombre de la tabla.

  • Los intervalos se basan en la hora del reloj. Los intervalos de 1 minuto terminan en el minuto, los intervalos de 10 minutos terminan cada 10 minutos a partir de la hora en punto y los intervalos de 1 hora terminan a la hora en punto.

    Por ejemplo, a las 11:59:30, los intervalos más recientes disponibles para las consultas SQL son los siguientes:

    • 1 minuto: de 11:58:00 a 11:58:59
    • 10 minutos: de 11:40:00 a 11:49:59
    • 1 hora: de 10:00:00 a 10:59:59
  • Cada fila contiene estadísticas de todas las consultas ejecutadas en la base de datos durante el intervalo especificado, agregadas. Solo hay una fila por intervalo de tiempo, que incluye las consultas completadas, las fallidas y las canceladas por el usuario.

  • Las estadísticas recogidas en las tablas TOTAL pueden incluir consultas que Spanner no haya recogido en las tablas TOP.

  • Algunas columnas de estas tablas se muestran como métricas en Cloud Monitoring. Las métricas expuestas son las siguientes:

    • Número de ejecuciones de consultas
    • Errores de consulta
    • Latencias de las consultas
    • Número de filas devueltas
    • Recuento de filas analizadas
    • Número de bytes devueltos
    • Tiempo de CPU de la consulta

    Para obtener más información, consulta Métricas de Spanner.

Esquema de tabla

Nombre de la columna Tipo Descripción
INTERVAL_END TIMESTAMP Final del intervalo de tiempo en el que se produjeron las ejecuciones de consultas incluidas.
EXECUTION_COUNT INT64 Número de veces que Spanner ha visto la consulta durante el intervalo de tiempo.
AVG_LATENCY_SECONDS FLOAT64 Duración media, en segundos, de cada ejecución de consulta en la base de datos. Este promedio no incluye el tiempo de codificación y transmisión del conjunto de resultados, ni tampoco la sobrecarga.
AVG_ROWS FLOAT64 Número medio de filas que ha devuelto la consulta.
AVG_BYTES FLOAT64 Número medio de bytes de datos que ha devuelto la consulta, sin incluir la sobrecarga de codificación de transmisión.
AVG_ROWS_SCANNED FLOAT64 Número medio de filas que ha analizado la consulta, sin incluir los valores eliminados.
AVG_CPU_SECONDS FLOAT64 Número medio de segundos de tiempo de CPU que Spanner ha dedicado a todas las operaciones para ejecutar la consulta.
ALL_FAILED_EXECUTION_COUNT INT64 Número de veces que la consulta ha fallado durante el intervalo.
ALL_FAILED_AVG_LATENCY_SECONDS FLOAT64 Duración media, en segundos, de cada ejecución de consulta que ha fallado en la base de datos. Este promedio no incluye el tiempo de codificación y transmisión del conjunto de resultados, así como la sobrecarga.
CANCELLED_OR_DISCONNECTED_EXECUTION_COUNT INT64 Número de veces que el usuario ha cancelado la consulta o que ha fallado debido a una conexión de red interrumpida durante el intervalo.
TIMED_OUT_EXECUTION_COUNT INT64 Número de veces que la consulta ha agotado el tiempo de espera durante el intervalo.
AVG_BYTES_WRITTEN FLOAT64 Número medio de bytes escritos por la instrucción.
AVG_ROWS_WRITTEN FLOAT64 Número medio de filas modificadas por la instrucción.
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT INT64 El número de veces que se han ejecutado consultas como parte de transacciones de lectura y escritura. Esta columna te ayuda a determinar si puedes evitar las contenciones de bloqueo moviendo algunas consultas a transacciones de solo lectura.
LATENCY_DISTRIBUTION ARRAY<STRUCT>

Un histograma del tiempo de ejecución de las consultas. Los valores se miden en segundos.

Especifique la matriz de la siguiente manera:
ARRAY<STRUCT<
  COUNT INT64,
  MEAN FLOAT64,
  SUM_OF_SQUARED_DEVIATION FLOAT64,
  NUM_FINITE_BUCKETS INT64,
  GROWTH_FACTOR FLOAT64,
  SCALE FLOAT64,
  BUCKET_COUNTS ARRAY<INT64>>>

Para obtener más información sobre los valores, consulte Distribución.

Para calcular la latencia del percentil a partir de la distribución, usa la función SPANNER_SYS.DISTRIBUTION_PERCENTILE(distribution, n FLOAT64), que devuelve el percentil n estimado. Para ver un ejemplo relacionado, consulta Buscar la latencia del percentil 99 de las consultas.

Para obtener más información, consulta Métricas de percentiles y de distribución.

Conservación de datos

Como mínimo, Spanner conserva los datos de cada tabla durante los siguientes periodos:

  • SPANNER_SYS.QUERY_STATS_TOP_MINUTE y SPANNER_SYS.QUERY_STATS_TOTAL_MINUTE: intervalos que abarcan las 6 horas anteriores.

  • SPANNER_SYS.QUERY_STATS_TOP_10MINUTE y SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE: intervalos que abarcan los 4 días anteriores.

  • SPANNER_SYS.QUERY_STATS_TOP_HOUR y SPANNER_SYS.QUERY_STATS_TOTAL_HOUR: intervalos que abarcan los 30 días anteriores.

Consultas de ejemplo

En esta sección se incluyen varios ejemplos de instrucciones SQL que obtienen estadísticas de consultas. Puedes ejecutar estas instrucciones SQL con las bibliotecas de cliente, la CLI de Google Cloud o la consola deGoogle Cloud .

Lista las estadísticas básicas de cada consulta en un periodo determinado

La siguiente consulta devuelve los datos sin procesar de las consultas principales del minuto anterior:

SELECT text,
       request_tag,
       interval_end,
       execution_count,
       avg_latency_seconds,
       avg_rows,
       avg_bytes,
       avg_rows_scanned,
       avg_cpu_seconds
FROM spanner_sys.query_stats_top_minute
ORDER BY interval_end DESC;

Lista de estadísticas de instrucciones DML particionadas que se ejecutan durante más de una hora

La siguiente consulta devuelve el recuento de ejecuciones y la media de filas escritas por las consultas de DML con particiones principales de las últimas horas:

SELECT text,
       request_tag,
       interval_end,
       sum(execution_count) as execution_count
       sum(avg_rows_written*execution_count)/sum(execution_count) as avg_rows_written
FROM spanner_sys.query_stats_top_hour
WHERE starts_with(text, "UPDATE") AND query_type = "PARTITIONED_QUERY"
group by text, request_tag, interval_end
ORDER BY interval_end DESC;

Enumera las consultas con el mayor uso de CPU

La siguiente consulta devuelve las consultas con el mayor uso de CPU de la hora anterior:

SELECT text,
       request_tag,
       execution_count AS count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY total_cpu DESC;

Consultar el número total de ejecuciones en un periodo determinado

La siguiente consulta devuelve el número total de consultas ejecutadas en el intervalo de 1 minuto completo más reciente:

SELECT interval_end,
       execution_count
FROM spanner_sys.query_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_minute);

Consultar la latencia media de una consulta

La siguiente consulta devuelve la información de latencia media de una consulta específica:

SELECT avg_latency_seconds
FROM spanner_sys.query_stats_top_hour
WHERE text LIKE "SELECT x FROM table WHERE x=@foo;";

Consulta la latencia del percentil 99 de las consultas

La siguiente consulta devuelve el percentil 99 del tiempo de ejecución de las consultas que se han ejecutado en los últimos 10 minutos:

SELECT interval_end, avg_latency_seconds, SPANNER_SYS.DISTRIBUTION_PERCENTILE(latency_distribution[OFFSET(0)], 99.0)
  AS percentile_latency
FROM spanner_sys.query_stats_total_10minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_total_10minute)
ORDER BY interval_end;

Comparar la latencia media con la latencia del percentil 99 ayuda a identificar posibles consultas atípicas con tiempos de ejecución elevados.

Buscar las consultas que analizan la mayor cantidad de datos

Puedes usar el número de filas analizadas por una consulta como medida de la cantidad de datos que ha analizado la consulta. La siguiente consulta devuelve el número de filas analizadas por las consultas ejecutadas en la hora anterior:

SELECT text,
       execution_count,
       avg_rows_scanned
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY avg_rows_scanned DESC;

Buscar las instrucciones que han escrito la mayor cantidad de datos

Puedes usar el número de filas escritas (o bytes escritos) por DML como medida de la cantidad de datos que ha modificado la consulta. La siguiente consulta devuelve el número de filas escritas por las instrucciones DML ejecutadas en la hora anterior:

SELECT text,
       execution_count,
       avg_rows_written
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY avg_rows_written DESC;

Total del uso de CPU en todas las consultas

La siguiente consulta devuelve el número de horas de CPU usadas en la hora anterior:

SELECT (avg_cpu_seconds * execution_count / 60 / 60)
  AS total_cpu_hours
FROM spanner_sys.query_stats_total_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_total_hour);

Mostrar las consultas que han fallado en un periodo determinado

La siguiente consulta devuelve los datos sin procesar, incluido el recuento de ejecuciones y la latencia media de las consultas fallidas de las consultas principales del minuto anterior. Estas estadísticas no registran las declaraciones de DML particionado fallidas ni canceladas.

SELECT text,
       request_tag,
       interval_end,
       execution_count,
       all_failed_execution_count,
       all_failed_avg_latency_seconds,
       avg_latency_seconds,
       avg_rows,
       avg_bytes,
       avg_rows_scanned,
       avg_cpu_seconds
FROM spanner_sys.query_stats_top_minute
WHERE all_failed_execution_count > 0
ORDER BY interval_end;

Consultar el número total de errores en un periodo determinado

La siguiente consulta devuelve el número total de consultas que no se han podido ejecutar en el intervalo de 1 minuto completo más reciente. Estas estadísticas no registran las declaraciones de DML particionado fallidas ni canceladas.

SELECT interval_end,
       all_failed_execution_count
FROM spanner_sys.query_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_minute)
ORDER BY interval_end;

Enumera las consultas que agotan el tiempo de espera con más frecuencia

La siguiente consulta devuelve las consultas con el mayor número de tiempos de espera de la hora anterior.

SELECT text,
       execution_count AS count,
       timed_out_execution_count AS timeout_count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY timed_out_execution_count DESC;

Consulta la latencia media de las ejecuciones correctas y fallidas de una consulta

La siguiente consulta devuelve la latencia media combinada, la latencia media de las ejecuciones correctas y la latencia media de las ejecuciones fallidas de una consulta específica. Estas estadísticas no registran las instrucciones DML particionadas fallidas ni canceladas.

SELECT avg_latency_seconds AS combined_avg_latency,
       all_failed_avg_latency_seconds AS failed_execution_latency,
       ( avg_latency_seconds * execution_count -
         all_failed_avg_latency_seconds * all_failed_execution_count
       ) / (
       execution_count - all_failed_execution_count ) AS success_execution_latency
FROM   spanner_sys.query_stats_top_hour
WHERE  text LIKE "select x from table where x=@foo;";

Solucionar problemas de uso elevado de la CPU o de latencia de las consultas con estadísticas de consultas

Las estadísticas de consultas son útiles cuando necesitas investigar un uso elevado de la CPU en tu base de datos de Spanner o cuando solo quieres entender las formas de las consultas que consumen mucha CPU en tu base de datos. Al inspeccionar las consultas que usan cantidades significativas de recursos de la base de datos, los usuarios de Spanner pueden reducir los costes operativos y mejorar las latencias generales del sistema.

Puedes usar código SQL o el panel de control Información valiosa sobre las consultas para investigar las consultas problemáticas de tu base de datos. En los siguientes temas se muestra cómo investigar estas consultas mediante código SQL.

Aunque el siguiente ejemplo se centra en el uso de la CPU, se pueden seguir pasos similares para solucionar problemas de latencia de consulta elevada y encontrar las consultas con las latencias más altas. Solo tiene que seleccionar intervalos de tiempo y consultas por latencia en lugar de por uso de CPU.

Seleccionar un periodo para investigar

Empieza tu investigación buscando un momento en el que tu aplicación empezara a experimentar un uso elevado de la CPU. Por ejemplo, si el problema empezó a producirse alrededor de las 17:00 del 24 de julio del 2020 (UTC).

Recoger estadísticas de consultas del periodo seleccionado

Una vez que hayamos seleccionado el periodo para iniciar la investigación, consultaremos las estadísticas recogidas en la tabla QUERY_STATS_TOTAL_10MINUTE en ese momento. Los resultados de esta consulta pueden indicar cómo han cambiado la CPU y otras estadísticas de la consulta durante ese periodo.

La siguiente consulta devuelve las estadísticas de consultas agregadas desde las 16:30 hasta las 17:30 UTC (ambas incluidas). Usamos ROUND en nuestra consulta para restringir el número de decimales con fines de visualización.

SELECT interval_end,
       execution_count AS count,
       ROUND(avg_latency_seconds,2) AS latency,
       ROUND(avg_rows,2) AS rows_returned,
       ROUND(avg_bytes,2) AS bytes,
       ROUND(avg_rows_scanned,2) AS rows_scanned,
       ROUND(avg_cpu_seconds,3) AS avg_cpu
FROM spanner_sys.query_stats_total_10minute
WHERE
  interval_end >= "2020-07-24T16:30:00Z"
  AND interval_end <= "2020-07-24T17:30:00Z"
ORDER BY interval_end;

Al ejecutar la consulta, se obtuvieron los siguientes resultados.

interval_end recuento latencia rows_returned bytes rows_scanned avg_cpu
2020-07-24T16:30:00Z 6 0,06 5,00 536,00 16,67 0,035
2020-07-24T16:40:00Z 55 0,02 0,22 25,29 0,22 0,004
2020-07-24T16:50:00Z 102 0,02 0,30 33.35 0,30 0,004
2020-07-24T17:00:00Z 154 1.06 4.42 486.33 7792208.12 4.633
2020-07-24T17:10:00Z 94 0,02 1,68 106,84 1,68 0,006
2020-07-24T17:20:00Z 110 0,02 0,38 34,60 0,38 0,005
2020-07-24T17:30:00Z 47 0,02 0,23 24,96 0,23 0,004

En la tabla anterior, vemos que el tiempo medio de CPU, la columna avg_cpu de la tabla de resultados, es más alto en los intervalos resaltados que terminan a las 17:00. También vemos un número de filas analizadas mucho mayor de media. Esto indica que las consultas más caras se ejecutaron entre las 16:50 y las 17:00. Elige ese intervalo para investigar más a fondo en el siguiente paso.

Buscar las consultas que provocan un uso elevado de la CPU

Una vez que hemos seleccionado el intervalo de tiempo que queremos investigar, consultamos la tabla QUERY_STATS_TOP_10MINUTE. Los resultados de esta consulta pueden ayudar a identificar qué consultas provocan un uso elevado de la CPU.

SELECT text_fingerprint AS fingerprint,
       execution_count AS count,
       ROUND(avg_latency_seconds,2) AS latency,
       ROUND(avg_cpu_seconds,3) AS cpu,
       ROUND(execution_count * avg_cpu_seconds,3) AS total_cpu
FROM spanner_sys.query_stats_top_10MINUTE
WHERE
  interval_end = "2020-07-24T17:00:00Z"
ORDER BY total_cpu DESC;

Al ejecutar esta consulta, se obtienen los siguientes resultados.

huella digital recuento latencia CPU total_cpu
5505124206529314852 30 3.88 17.635 529.039
1697951036096498470 10 4.49 18.388 183.882
2295109096748351518 1 0,33 0,048 0,048
11618299167612903606 1 0,25 0,021 0,021
10302798842433860499 1 0,04 0,006 0,006
123771704548746223 1 0,04 0,006 0,006
4216063638051261350 1 0,04 0,006 0,006
3654744714919476398 1 0,04 0,006 0,006
2999453161628434990 1 0,04 0,006 0,006
823179738756093706 1 0,02 0,005 0,0056

Las dos consultas principales, destacadas en la tabla de resultados, son valores atípicos en cuanto a la latencia y la CPU medias, así como al número de ejecuciones y a la CPU total. Investiga la primera consulta que aparece en estos resultados.

Comparar ejecuciones de consultas a lo largo del tiempo

Ahora que hemos acotado la investigación, podemos centrarnos en la tabla QUERY_STATS_TOP_MINUTE. Al comparar las ejecuciones de una consulta concreta a lo largo del tiempo, podemos buscar correlaciones entre el número de filas o bytes devueltos, o el número de filas analizadas y la latencia o el uso de CPU elevados. Una desviación puede indicar una falta de uniformidad en los datos. Si el número de filas analizadas es alto de forma constante, puede indicar que faltan índices adecuados o que el orden de las combinaciones no es óptimo.

Investiga la consulta que muestra el uso medio de CPU más alto y la latencia más alta ejecutando la siguiente instrucción, que filtra por el texto_fingerprint de esa consulta.

SELECT interval_end,
       ROUND(avg_latency_seconds,2) AS latency,
       avg_rows AS rows_returned,
       avg_bytes AS bytes_returned,
       avg_rows_scanned AS rows_scanned,
       ROUND(avg_cpu_seconds,3) AS cpu,
FROM spanner_sys.query_stats_top_minute
WHERE text_fingerprint = 5505124206529314852
ORDER BY interval_end DESC;

Al ejecutar esta consulta, se obtienen los siguientes resultados.

interval_end latencia rows_returned bytes_returned rows_scanned CPU
2020-07-24T17:00:00Z 4.55 21 2365 30000000 19.255
2020-07-24T16:00:00Z 3.62 21 2365 30000000 17.255
2020-07-24T15:00:00Z 4,37 21 2365 30000000 18.350
2020-07-24T14:00:00Z 4.02 21 2365 30000000 17.748
2020-07-24T13:00:00Z 3.12 21 2365 30000000 16.380
2020-07-24T12:00:00Z 3,45 21 2365 30000000 15.476
2020-07-24T11:00:00Z 4.94 21 2365 30000000 22.611
2020-07-24T10:00:00Z 6,48 21 2365 30000000 21.265
2020-07-24T09:00:00Z 0,23 21 2365 5 0,040
2020-07-24T08:00:00Z 0,04 21 2365 5 0,021
2020-07-24T07:00:00Z 0,09 21 2365 5 0,030

Al examinar los resultados anteriores, vemos que el número de filas analizadas, la CPU usada y la latencia cambiaron significativamente alrededor de las 9:00. Para saber por qué aumentaron tanto estas cifras, examinaremos el texto de la consulta y veremos si algún cambio en el esquema ha podido afectar a la consulta.

Usa la siguiente consulta para obtener el texto de la consulta que estamos investigando.

SELECT text,
       text_truncated
FROM spanner_sys.query_stats_top_hour
WHERE text_fingerprint = 5505124206529314852
LIMIT 1;

Se devuelve el siguiente resultado.

texto text_truncated
select * from orders where o_custkey = 36901; falso

Al examinar el texto de la consulta devuelta, nos damos cuenta de que la consulta está filtrando un campo llamado o_custkey. Se trata de una columna que no es clave en la tabla orders. Resulta que había un índice en esa columna que se eliminó alrededor de las 9:00. Esto explica el cambio en el coste de esta consulta. Podemos volver a añadir el índice o, si la consulta se ejecuta con poca frecuencia, decidir no tener el índice y aceptar el mayor coste de lectura.

Hasta ahora, nuestra investigación se ha centrado en las consultas que se han completado correctamente y hemos encontrado un motivo por el que la base de datos ha experimentado una degradación del rendimiento. En el siguiente paso, nos centraremos en las consultas fallidas o canceladas y mostraremos cómo examinar esos datos para obtener más información valiosa.

Investigar consultas fallidas

Las consultas que no se completan correctamente siguen consumiendo recursos antes de que se agote el tiempo de espera, se cancelen o fallen de otro modo. Spanner monitoriza el número de ejecuciones y los recursos consumidos por las consultas fallidas, así como por las que se han completado correctamente. Estas estadísticas no registran las instrucciones DML particionadas fallidas ni canceladas.

Para comprobar si las consultas fallidas contribuyen de forma significativa a la utilización del sistema, primero podemos comprobar cuántas consultas han fallado en el intervalo de tiempo de interés.

SELECT interval_end,
       all_failed_execution_count AS failed_count,
       all_failed_avg_latency_seconds AS latency
FROM spanner_sys.query_stats_total_minute
WHERE
  interval_end >= "2020-07-24T16:50:00Z"
  AND interval_end <= "2020-07-24T17:00:00Z"
ORDER BY interval_end;
interval_end failed_count latencia
2020-07-24T16:52:00Z 1 15,211391 USD
2020-07-24T16:53:00Z 3 58.312232

Si investigamos más a fondo, podemos buscar las consultas que tengan más probabilidades de fallar con la siguiente consulta.

SELECT interval_end,
       text_fingerprint,
       execution_count,
       avg_latency_seconds AS avg_latency,
       all_failed_execution_count AS failed_count,
       all_failed_avg_latency_seconds AS failed_latency,
       cancelled_or_disconnected_execution_count AS cancel_count,
       timed_out_execution_count AS to_count
FROM spanner_sys.query_stats_top_minute
WHERE all_failed_execution_count > 0
ORDER BY interval_end;
interval_end text_fingerprint execution_count failed_count cancel_count to_count
2020-07-24T16:52:00Z 5505124206529314852 3 1 1 0
2020-07-24T16:53:00Z 1697951036096498470 2 1 1 0
2020-07-24T16:53:00Z 5505124206529314852 5 2 1 1

Como se muestra en la tabla anterior, la consulta con la huella digital 5505124206529314852 ha fallado varias veces durante diferentes intervalos de tiempo. Si se da un patrón de errores como este, es interesante comparar la latencia de las ejecuciones correctas y las incorrectas.

SELECT interval_end,
       avg_latency_seconds AS combined_avg_latency,
       all_failed_avg_latency_seconds AS failed_execution_latency,
       ( avg_latency_seconds * execution_count -
         all_failed_avg_latency_seconds * all_failed_execution_count
       ) / (
       execution_count - all_failed_execution_count ) AS success_execution_latency
FROM   spanner_sys.query_stats_top_hour
WHERE  text_fingerprint = 5505124206529314852;
interval_end combined_avg_latency failed_execution_latency success_execution_latency
2020-07-24T17:00:00Z 3,880420 13.830709 2,774832

Aplicar prácticas recomendadas

Una vez que hemos identificado una consulta candidata para la optimización, podemos consultar el perfil de la consulta y probar a optimizarla con las prácticas recomendadas de SQL.

Siguientes pasos