Saltar al contenido

¿Cómo puedo solucionar problemas de uso excesivo o completo del disco con Amazon Redshift?

9 minutos de lectura
0

He experimentado un uso excesivo o completo del disco en Amazon Redshift y quiero solucionar este problema.

Resolución

Para resolver problemas de uso excesivo o de disco en Amazon Redshift, sigue estos pasos de solución de problemas.

Clave de ordenación y distribución

Revisa el estilo de distribución, la clave de distribución y la selección de claves de ordenación de la tabla. Las tablas con sesgo de distribución pueden provocar que el nodo del disco esté lleno. Si tienes tablas con estilos de distribución sesgados, cambia el estilo de distribución a una distribución más uniforme. La distribución y el sesgo de filas pueden afectar al sesgo de almacenamiento y al conjunto de filas intermedio cuando se ejecuta una consulta.

Para obtener la cardinalidad de la clave de distribución, ejecuta la siguiente consulta:

SELECT <distkey column>, COUNT(*)
 FROM <schema name>.<table with distribution skew>
 GROUP BY <distkey column>
 HAVING COUNT(*) > 1
 ORDER BY 2 DESC;

Nota: Reemplaza la columna distkey, el nombre del esquema y la tabla con sesgo de distribución con las variables de tu tabla.

Para evitar un paso de ordenación, utiliza las columnas SORT KEY de la cláusula ORDER BY. Un paso de ordenación puede consumir demasiada memoria y provocar que el disco se desborde. Para obtener más información, consulta Claves de ordenación.

En el conjunto de resultados filtrado, elige una columna con una cardinalidad alta para ver su distribución de datos. Para obtener más información, consulta Elegir el modo de distribución recomendado.

Procesamiento de consultas

Revisa cualquier memoria de consulta asignada. Los resultados de las consultas intermedias se pueden almacenar en bloques temporales cuando se procesan las consultas. Si no hay suficiente memoria libre, las tablas provocan un desbordamiento en el disco. Los conjuntos de resultados intermedios no se comprimen, lo que afecta al espacio disponible en disco. Para obtener más información, consulta Memoria insuficiente asignada a la consulta.

Amazon Redshift utiliza de forma predeterminada una estructura de tablas con una distribución uniforme y sin codificación de columnas para las tablas temporales. Si utilizas la sintaxis SELECT...INTO, utiliza una instrucción CREATE. Para obtener más información, consulta la sugerencia n.º 6 en Top 10 performance tuning techniques for Amazon Redshift (10 técnicas principales de ajuste de rendimiento para Amazon Redshift).

Si no hay suficiente memoria asignada a tu consulta, es posible que veas un paso en SVL_QUERY_SUMMARY donde is_diskbased muestra el valor true. La siguiente consulta identifica las 20 consultas principales sobre desbordamiento en el disco durante un tiempo específico:

SELECT q.userid, q.query, q.starttime, q.endtime, m.query_temp_blocks_to_disk, btrim(querytxt)  
 FROM stl_query q JOIN SVL_QUERY_METRICS_SUMMARY m ON m.query = q.query
 WHERE m.query_temp_blocks_to_disk > 0
   AND starttime BETWEEN '2025-01-01 00:00:00' AND '2025-01-02 00:00:00'
 ORDER BY m.query_temp_blocks_to_disk DESC
 LIMIT 20;

Para resolver este problema, aumenta el número de ranuras de consulta para asignar más memoria a la consulta. 

Si observas un aumento repentino en la utilización, ejecuta la siguiente consulta para identificar las 20 consultas principales sobre desbordamiento en el disco:

SELECT a.userid, a.query, a.blocks_to_disk, trim(b.text) as text
 FROM stv_query_metrics a, stv_inflight b
 WHERE a.query = b.query
   AND a.segment = -1
   AND a.step_type = -1
   AND a.max_blocks_to_disk > 0
 ORDER BY 3 DESC
 LIMIT 20;

En el resultado, consulta el valor de columna blocks_to_disk para identificar los desbordamientos en el disco. Termina las consultas que ocupan demasiado espacio y, a continuación, asigna más memoria a las consultas antes de volver a ejecutarlas.

También puedes utilizar las reglas de supervisión de consultas de WLM para contrarrestar las cargas de procesamiento pesadas e identificar las consultas con un uso intensivo de E/S.

Tablas con columnas VARCHAR(MAX)

Consulta las columnas VARCHAR o CHARACTER VARYING para ver si hay espacios en blanco al final que puedan omitirse cuando los datos se almacenan en el disco. Cuando se procesan las consultas, los espacios en blanco finales pueden ocupar toda la longitud de la memoria. El valor máximo para VARCHAR y CHARACTER VARYING es de 65 535 bytes. Se recomienda utilizar el tamaño de columna más pequeño posible.

Para generar una lista de tablas con anchos de columna máximos, ejecuta la siguiente consulta:

SELECT database, schema || '.' || "table" AS "table", max_varchar
 FROM svv_table_info
 WHERE max_varchar > 150 ORDER BY 2;

Ejecuta la siguiente consulta para identificar y mostrar los anchos reales de las columnas anchas de la tabla VARCHAR:

SELECT max(octet_length (rtrim(column_name))) FROM table_name;

En el resultado de esta consulta, confirma que la longitud se ajusta a tu caso de uso. Si las columnas tienen la longitud máxima y superan tus necesidades, ajusta su longitud al tamaño mínimo necesario.

Para obtener más información, consulta Prácticas recomendadas de Amazon Redshift para el diseño de tablas.

Alta compresión de columna

Para codificar todas las columnas excepto la clave de ordenación, utiliza ANALYZE COMPRESSION o la optimización automática de tablas. Se recomienda utilizar la codificación de columnas.

Operaciones de mantenimiento

Asegúrate de analizar y vaciar con regularidad las tablas de bases de datos de tu base de datos de Amazon Redshift. Identifica cualquier consulta que se ejecute en tablas a las que les falten estadísticas. A continuación, evita que las consultas se ejecuten en tablas a las que les falten estadísticas para que Amazon Redshift no analice filas de tablas innecesarias.

Nota: Las operaciones de mantenimiento, como VACUUM y DEEP COPY, utilizan espacio de almacenamiento temporal para sus operaciones de ordenación y pueden provocar un aumento en el uso del disco.

Por ejemplo, la siguiente consulta identifica las estadísticas desactualizadas en Amazon Redshift:

SELECT table_id, database, schema, "table", stats_off, size
 FROM svv_table_info
 WHERE stats_off > 10
 ORDER BY size DESC;

Además, utiliza el comando ANALYZE para ver y analizar las estadísticas de la tabla.

Productos cartesianos con uniones cruzadas

Utiliza el plan EXPLAIN de la consulta para buscar consultas con productos cartesianos. Los productos cartesianos son uniones cruzadas que no están relacionadas y pueden aumentar el número de bloques. Estas uniones cruzadas pueden provocar una mayor utilización de la memoria y más tablas desbordadas en el disco. Si las uniones cruzadas no comparten la condición JOIN, las uniones producen un producto cartesiano de dos tablas. Cada fila de una tabla se une a cada fila de la otra tabla.

Las uniones cruzadas también pueden ejecutarse como uniones de bucles anidados y provocar tiempos de proceso prolongados. Las uniones de bucles anidados provocan picos en el uso general del disco. Para obtener más información, consulta Identificación de consultas con bucles anidados.

Tamaño mínimo de tabla

Las tablas individuales pueden tener diferentes tamaños en diferentes clústeres. El tamaño mínimo de la tabla se determina por el número de columnas y por si la tabla tiene un valor SORTKEY y el número de segmentos rellenados. Si has cambiado recientemente el tamaño de un clúster de Amazon Redshift, es posible que observes un cambio en el almacenamiento general en disco provocado por el cambio de segmentos. Amazon Redshift también cuenta los segmentos de tabla que utiliza cada tabla. Para obtener más información, consulta ¿Por qué una tabla de un clúster de Amazon Redshift consume más o menos espacio de almacenamiento en disco del esperado?

Bloques de lápidas

Los bloques de lápidas se generan cuando se produce una transacción WRITE en una tabla de Amazon Redshift y hay una operación de lectura simultánea. Amazon Redshift conserva los bloques antes de la operación de escritura para mantener la coherencia de una operación de lectura simultánea. No puedes cambiar los bloques de Amazon Redshift. Cada acción Insert, Update o Delete crea un nuevo conjunto de bloques y marca los bloques antiguos como lápidas.

A veces, las lápidas no se borran en la fase de confirmación debido a transacciones de la tabla de larga duración. También es posible que las lápidas no se borren cuando hay demasiadas cargas de ETL ejecutándose al mismo tiempo. Dado que Amazon Redshift supervisa la base de datos desde el momento en que se inicia la transacción, cualquier tabla que se escriba en la base de datos también conserva los bloques de lápidas. Si las transacciones de tablas de larga ejecución se realizan de forma regular y en varias cargas, se pueden acumular suficientes lápidas como para provocar un error «Disk Full».

Si hay consultas activas durante mucho tiempo, ejecuta el comando commit para finalizar las consultas y liberar todos los bloques posteriores:

begin;
create table a (id int);
insert into a values(1);
commit;
drop table a;

Ejecuta la siguiente consulta para confirmar los bloques de lápidas:

SELECT trim(name) as tablename, count(case when tombstone > 0 then 1 else null end) as tombstones
 FROM svv_diskusage
 GROUP BY 1
 HAVING count(case when tombstone > 0 then 1 else null end) > 0
 ORDER BY 2 DESC;

Copia de un archivo grande

Es posible que una operación COPY reciba un error «Disk Full» aunque haya suficiente espacio de almacenamiento disponible. Este error se produce si la operación de ordenación se desborda en el disco y crea bloques temporales.

Si aparece un mensaje de error «Disk Full», comprueba la tabla STL_DISK_FULL_DIAG. Comprueba los bloqueos temporales y el ID de consulta que provocó el error:

SELECT
  '2000-01-01'::timestamp + (currenttime/1000000.0)* interval '1 second' as currenttime,
  node_num,
  query_id,
  temp_blocks
 FROM stl_disk_full_diag;

Para obtener más información, consulta Prácticas recomendadas de Amazon Redshift para la carga de datos.

Bloques de consulta de recurso compartido de datos en clústeres de consumidores

Cuando se ejecuta una consulta de recurso compartido de datos en el clúster de consumidores, los bloques de datos asociados a la consulta se cuentan en las métricas de PercentageDiskSpaceUsed. Estos bloques de datos eliminan las métricas de PercentageDiskSpaceUsed debido a un reinicio del clúster y a otros factores. No se requieren más acciones para este comportamiento esperado.

Comprobación del espacio en disco

Comprueba el porcentaje de espacio en disco en la pestaña Rendimiento de la consola de Amazon Redshift.

Información relacionada

Rendimiento de Amazon Redshift

OFICIAL DE AWSActualizada hace 6 meses