Saltar al contenido

¿Cómo soluciono los problemas con VACUUM en Amazon Redshift?

8 minutos de lectura
0

Mis consultas de VACUUM fallan en mi clúster de Amazon Redshift.

Descripción corta

VACUUM es una operación que consume muchos recursos y puede ralentizarse debido a lo siguiente:

Utiliza la consulta svv_vacuum_progress para comprobar el estado y los detalles de la operación VACUUM.

Resolución

Solución de problemas de rendimiento de VACUUM

Nota: Lo siguiente se aplica a los clústeres de Amazon Redshift aprovisionados. Las siguientes tablas y consultas del sistema no funcionan en Amazon Redshift sin servidor.

Para comprobar si la operación VACUUM está en curso, ejecuta la siguiente consulta SVV_VACUUM_PROGRESS:

dev=# SELECT * FROM svv_vacuum_progress;
table_name |          status                 | time_remaining_estimate
-----------+---------------------------------+-------------------------
data8     |  Vacuum: initialize merge data8 | 4m 55s
(1 row)

La consulta SVV_VACUUM_PROGRESS también incluye el nombre de la tabla, el estado de VACUUM y el tiempo estimado que queda hasta que se complete. Si VACUUM no se está ejecutando, la consulta SVV_VACUUM_PROGRESS muestra el estado de la última ejecución de VACUUM. La consulta SVV_VACUUM_PROGRESS devuelve solo una fila de resultados.

Para comprobar los detalles de la tabla en la que VACUUM está en curso, ejecuta la siguiente consulta:

SELECT schema, table_id, "table", diststyle, sortkey1, sortkey_num, unsorted, tbl_rows, estimated_visible_rows, stats_off  
FROM svv_table_info  
WHERE "table" IN ('data8');

Nota: Sustituye table por el nombre de la tabla y data8 por el nombre del esquema.

Resultado de ejemplo:

Schema     | table_id | table | diststyle | sortkey1 | sortkey_num | unsorted | tbl_rows  | est_visible_rows | stats_off  
------------+----------+-------+-----------+----------+-------------+----------+-----------+------------------+-----------
testschema | 977719   | data8 | EVEN      | order_id |  2          |    25.00 | 755171520 | 566378624        | 100.00

Del resultado anterior, la columna sortkey1 muestra la clave de ordenación principal.

Si la columna sortkey1 muestra INTERLEAVED, la tabla tiene una clave de ordenación intercalada.

La columna sortkey_num muestra el número de columnas de la clave de ordenación.

La columna sin ordenar muestra el porcentaje de filas que deben ordenarse.

La columna tbl_rows muestra el número total de filas, incluidas las filas eliminadas y actualizadas.

La columna estimated_visible_rows representa el número de filas que excluye las filas eliminadas.

Tras un vaciado total (eliminar y ordenar), los valores de tbl_rows y estimated_visible_rows se parecen entre sí y el valor sin ordenar llega a 0.

Nota: Los datos de la tabla se actualizan en tiempo real. Para comprobar el progreso de VACUUM, continúa ejecutando la consulta. Las filas sin clasificar disminuyen gradualmente a medida que VACUUM avanza. Para confirmar si tienes un porcentaje alto de datos sin clasificar, consulta la información de VACUUM de una tabla específica.

Ejecuta la siguiente consulta para comprobar la información de VACUUM de una tabla.

SELECT table_id, status, rows, sortedrows, blocks, eventtime
FROM stl_vacuum
WHERE table_id=977719
ORDER BY eventtime DESC LIMIT 20;

Nota: Sustituye 97771 por el ID de la tabla de la consulta anterior.

Resultado de ejemplo:

table_id |             status             |    rows    | sortedrows | blocks |         eventtime
         ----------+--------------------------------+------------+------------+--------+----------------------------
  977719 | [VacuumBG] Finished            |  566378640 |          0 |  23618 | 2020-05-27 06:55:33.232536
  977719 | [VacuumBG] Started Delete Only | 1132757280 |  566378640 |  47164 | 2020-05-27 06:55:18.906008
  977719 | Finished                       |  566378640 |  566378640 |  23654 | 2020-05-27 06:46:04.086842
  977719 | Started                        | 1132757280 |  566378640 |  45642 | 2020-05-27 06:28:17.128345
(4 rows)

En el ejemplo anterior, el resultado muestra los eventos ordenados del más reciente al más antiguo:

El último VACUUM fue un VACUUM DELETE automático que comenzó el 2020-05-27 a las 06:55:18.906008 UTC y se completó en unos segundos.

Este VACUUM liberó el espacio que ocupaban las filas eliminadas. Puedes comparar los cambios en el número de bloques que ocupó la tabla desde el inicio y la finalización de VACUUM.

Nota: Amazon Redshift realiza automáticamente las operaciones VACUUM SORT y VACUUM DELETE en las tablas en segundo plano. Estos VACUUM de fondo funcionan durante los periodos de cargas reducidas y se detienen durante los periodos de carga alta. Este VACUUM automático reduce la necesidad de ejecutar el comando VACUUM.

La columna sortedrows muestra el número de filas ordenadas de la tabla. En el último VACUUM, no se ha realizado ninguna clasificación porque se trataba de una operación automática de VACUUM DELETE. Como las filas activas no se ordenaron, la fila marcada para su eliminación muestra el mismo número de filas ordenadas desde que comenzó VACUUM. Cuando se complete VACUUM DELETE, verás 0 filas ordenadas.

El VACUUM inicial que comenzó el 2020-05-27 a las 06:28:17.128345 UTC muestra un VACUUM completo. El proceso liberó el espacio de las filas eliminadas y clasificó las filas después de unos 18 minutos. Cuando se completa la operación VACUUM, la salida muestra los mismos valores para las columnas de rows y sortedrows porque VACUUM ha clasificado correctamente las filas.

En el caso de un VACUUM que ya esté en curso, continúa supervisando su rendimiento e incorporando las mejores prácticas.

Solución de errores de VACUUM

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de errores para la AWS CLI. Además, asegúrate de utilizar la versión más reciente de AWS CLI.

Para averiguar por qué falló una consulta de VACUUM, utiliza SYS_QUERY_HISTORY o STL_QUERY para comprobar si hay mensajes de error. Si usas STL_QUERY, debes obtener los detalles del error en STL_ERROR. Como STL_ERROR no tiene una columna de ID de consulta, busca el campo PID en STL_QUERY. A continuación, utiliza ese campo en la consulta STL_ERROR.

Ejemplo SYS_QUERY_HISTORY:

SELECT user_id, query_id, transaction_id, session_id,  status, start_time, end_time, execution_time, error_message FROM sys_query_history WHERE query_id IN (<failed queries>)


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

| user_id | query_id   | transaction_id |  session_id | status | start_time              |     end_time                  |  execution_time |   error_message |   
| 100        | 915082632 | 35599398     | 1096641177 | failed  | 2024-10-06 21:09:30.209587 | 2024-10

Si utilizas el enunciado execute para ejecutar la consulta VACUUM, utiliza el comando describe-statement de AWS CLI para identificar los mensajes de error.

Ejemplo de describe-statement:

aws redshift-data describe-statement --id 7c823348d-be8b-437a-9a0-db8c0ca44f0f
{
    "ClusterIdentifier": "redshift-cluster-1",
    "CreatedAt": "2024-10-07T16:25:27.566000+00:00",
    "Duration": -1,
    "Error": "ERROR: VACUUM cannot run inside a multiple commands statement",
    "HasResultSet": false,
    "Id": "7c823348d-be8b-437a-9a0-db8c0ca44f0f",
    "QueryString": "vacuum full toptem;\nvacuum full tsupport;\nvacuum full supplierxbox;\nvacuum full party;",
    "RedshiftPid": 10723479554,
    "RedshiftQueryId": 42304,
    "ResultRows": -1,
    "ResultSize": -1,
    "Status": "FAILED",
    "UpdatedAt": "2024-10-07T16:25:33.566000+00:00"
}

Si el clúster está completamente inactivo, ejecuta un VACUUM MANUAL para los intentos fallidos de VACUUM. Para obtener más información, consulta Succión y análisis manuales de las tablas.

Uso de las mejores prácticas de VACUUM

Puedes mejorar el rendimiento de VACUUM con las siguientes prácticas recomendadas.

Como VACUUM es una operación que consume muchos recursos, ejecútala fuera de las horas pico.

Utiliza wlm_query_slot_count para anular temporalmente el nivel de concurrencia en una cola para una operación VACUUM.

Ejecuta la operación VACUUM con un parámetro de umbral de hasta el 99 % para tablas grandes. Determina el umbral y la frecuencia apropiados para ejecutar VACUUM. Por ejemplo, es posible que desees ejecutar VACUUM con un umbral del 100 % o tener los datos siempre ordenados. Utiliza el enfoque que optimice el rendimiento de las consultas del clúster de Amazon Redshift.

Ejecuta un VACUUM FULL o VACUUM SORT ONLY con la frecuencia suficiente para que una región de AWS con un alto contenido sin ordenar no se acumule en tablas grandes.

Si hay una gran cantidad de datos sin ordenar en una tabla grande, realiza una copia en profundidad.

Ejecuta el comando VACUUM con la opción BOOST.

Divide las tablas grandes en tablas de series temporales para mejorar el rendimiento de VACUUM. En algunos casos, cuando utilizas una tabla de series temporales, puedes satisfacer la necesidad de ejecutar VACUUM.

Elige un tipo de compresión de columnas para tablas grandes. Las filas comprimidas consumen menos espacio en disco al ordenar los datos.

Utiliza el comando ANALYZE después de la operación VACUUM para actualizar las estadísticas. El planificador de consultas usa estos valores para elegir los mejores planes.

Información relacionada

How do I troubleshoot a failed or canceled query in Amazon Redshift? (¿Cómo soluciono una consulta fallida o cancelada en Amazon Redshift?)

¿Por qué se cancela o detiene mi consulta de Amazon Redshift sin servidor?

OFICIAL DE AWSActualizada hace 5 meses