Elegir correctamente el estilo de distribución en Amazon Redshift determina cómo se reparten los datos entre nodos y segmentos, lo que impacta directamente el rendimiento de tus consultas analíticas. Comprender las diferencias entre key, even y all —y saber verificar su comportamiento con tablas internas de Redshift— es fundamental para cualquier arquitecto de datos o ingeniero que trabaje con este data warehouse.
¿Cómo se define el estilo de distribución al crear una tabla?
La distribución se establece únicamente al momento de crear la tabla, no después. Esto significa que debes planificar con anticipación cómo se van a repartir tus datos. La instrucción clave es DISTSTYLE, que acepta tres valores posibles [0:38]:
- Key: distribuye los datos según los valores de una columna específica, indicada con
DISTKEY(nombre_columna).
- Even: reparte los registros de forma equitativa mediante round-robin, sin considerar ninguna columna en particular.
- All: copia la tabla completa en todos los nodos del clúster.
sql
CREATE TABLE dist_key (columna INT) DISTSTYLE KEY DISTKEY(columna);
CREATE TABLE dist_even (columna INT) DISTSTYLE EVEN;
CREATE TABLE dist_all (columna INT) DISTSTYLE ALL;
¿Qué sucede cuando no se especifica ningún estilo?
Cuando omites el DISTSTYLE, Redshift asigna automáticamente la distribución auto [2:23]. Con pocos registros, el sistema elige ALL como estrategia inicial. Sin embargo, si la tabla crece de manera acelerada, Redshift es lo suficientemente inteligente para cambiarla automáticamente a EVEN. Puedes verificar esto consultando la tabla del sistema SVV_TABLE_INFO [2:05]:
sql
SELECT * FROM svv_table_info WHERE "table" LIKE 'dist%';
Esta consulta devuelve el nombre de la tabla, el esquema y el estilo de distribución asignado.
¿Cómo verificar si la distribución de datos es equitativa?
Redshift ofrece tablas internas que permiten inspeccionar la distribución real de los datos. La tabla PG_TABLE_DEF muestra las columnas de cada tabla e indica cuál tiene la dist key y si posee ordenamiento [3:00]. Por ejemplo, la tabla users tiene distribución por la columna user_id.
Para un análisis más profundo, la tabla SVV_DISKUSAGE revela cómo se distribuyen los registros en cada slice o segmento [3:38]:
sql
SELECT DISTINCT slice, col, num_values, minvalue, maxvalue
FROM svv_diskusage
WHERE name = 'users' AND col = 0 AND num_values > 0
ORDER BY slice, col;
Con la tabla users y distribución key por user_id, los cuatro slices muestran aproximadamente 12,500 filas cada uno [4:55]. Esto representa una distribución equitativa, donde todos los nodos y segmentos trabajan cooperativamente para resolver un mismo problema.
¿Qué ocurre con una mala elección de dist key?
Al crear una tabla distribuida por la columna state en lugar de user_id, el resultado cambia drásticamente [5:17]. Un slice puede terminar con 14,688 registros mientras otro acumula 32,900. Esta distribución desigual genera que ciertos nodos trabajen mucho más que otros, lo que se traduce en consultas más lentas cuando la información buscada reside en el segmento sobrecargado.
¿Cuál es la diferencia práctica entre even y all?
La distribución even reparte los datos equitativamente entre slices, pero de forma aleatoria [6:27]. No existe un criterio de rango: los mismos valores mínimos pueden aparecer en distintos segmentos. Aunque la cantidad de filas se balancea bien, al hacer un JOIN con otra tabla que tenga distribución key, Redshift podría necesitar redistribuir los datos en tiempo de ejecución, ya que los registros relacionados no estarán en el mismo segmento.
Por eso, even es la opción por defecto recomendada cuando no sabes cómo se comportarán tus datos, pero la distribución key resulta superior si conoces las columnas que se usarán frecuentemente en joins [7:07].
La distribución all, por su parte, replica la totalidad de los registros en cada nodo [7:22]. Esto garantiza que cada slice tenga exactamente la misma cantidad —aproximadamente 99,000 registros para la tabla de ejemplo—, pero el costo en almacenamiento se multiplica. Solo conviene para tablas de dimensiones pequeñas que se usan constantemente en joins.
- Key: ideal cuando conoces la columna de join más frecuente y los valores están bien distribuidos.
- Even: segura como opción predeterminada, balancea filas sin criterio de orden.
- All: útil para tablas pequeñas de referencia que se consultan desde múltiples nodos.
Tu conocimiento del negocio y de la arquitectura es lo que te dará las claves para elegir el estilo correcto. Si tienes dudas sobre cuál aplicar en tu caso, compártelas en los comentarios.