¿Cómo evaluar el rendimiento de las consultas SQL con distintas llaves?
El análisis del rendimiento en la ejecución de consultas SQL es crucial para optimizar bases de datos. En este segmento, veremos cómo el uso de llaves simples, compuestas e intercaladas puede afectar el tiempo y eficiencia de las consultas. Además, comprenderemos cómo aprovechar estas estrategias para mejorar la velocidad de respuesta al trabajar con grandes volúmenes de datos.
¿Cómo funcionan las consultas básicas con diferentes tipos de llaves?
Para evaluar el impacto de las diferentes llaves, utilizamos consultas en tres tablas con estructuras variadas: simple, compuesta e intercalada. Usamos una consulta básica SELECT para entender el comportamiento de las llaves:
Replicamos esta consulta para las tres versiones de la tabla:
Tabla simple: tomó 4.2 segundos.
Tabla compuesta: redujo el tiempo a 0.118 segundos.
Tabla intercalada: se ejecutó en 3.69 segundos.
Este experimento muestra que la llave compuesta ofrece el mejor rendimiento en este caso particular al reducir considerablemente el tiempo de respuesta.
¿Por qué es importante el uso adecuado de las llaves?
Al apagar la caché de resultados y ejecutar nuevamente las consultas, notamos variaciones significativas en tiempos de ejecución:
Llave simple: mejoró de 4.2 segundos a 1.189 segundos.
Llave compuesta: mantuvo su rapidez en comparativa.
Llave intercalada: tomó 1.78 segundos.
Esto subraya la importancia del caché en la repetición de consultas y destaca cómo las llaves compuestas ofrecen un acceso más rápido en ciertas circunstancias al priorizar columnas claves.
¿Cuáles son los desafíos de filtrar con llaves sin relación directa?
Cuando los filtros no correlacionan directamente con las llaves de ordenamiento (e.g., filtrando por región y segmento en lugar de la llave primaria), el rendimiento disminuye, como puede observarse:
SELECT*FROMsimpleWHERE region ='Asia'AND segment ='Furniture';
Nuevamente, comprobando con las tres estructuras de tablas:
Llave simple: 4.3 segundos.
Llave compuesta: 4.4 segundos.
Llave intercalada: 3.8 segundos.
El uso de filtros no relacionados con las llaves de ordenamiento afecta negativamente el tiempo de respuesta. Sin embargo, la intercalación permite optimizar algunas operaciones, independientemente de la prioridad dada a las columnas.
¿Qué otras consideraciones debemos tener al diseñar nuestras consultas?
Al integrar la fecha como filtro con las llaves, observamos un patrón similar:
SELECT*FROMsimpleWHEREdateBETWEEN'1996-01-01'AND'1996-01-14'AND region ='Asia'AND segment ='Furniture';
Con esta reordenación:
Llave simple: 5.44 segundos.
Llave compuesta: 5.39 segundos.
Llave intercalada: 5.4 segundos.
Cuando se apaga la caché, pese a los tiempos de inserción elevados para la llave intercalada, su capacidad para mantener la prioridad homogénea en los filtros ofrece un rendimiento excepcional en consultas. No obstante, esta ventaja se asocia con una necesidad de limpieza periódica de datos.
Conclusión
Hemos explorado cómo la elección de llaves y su estructura puede afectar notablemente el rendimiento de las consultas SQL. Los resultados sugieren que, dependiendo del contexto y los datos, una llave compuesta o intercalada puede brindar una mejora significativa en eficiencia. Los desafíos de filtrado con columnas no claves e inserciones lentas son factores a considerar. Te animamos a experimentar con combinaciones de llaves y filtros para encontrar la solución óptima para tus necesidades específicas. ¡Sigue explorando y compartiendo tus hallazgos!
¿Pero por qué aún apagando el caché la segunda consulta es muchísimo más rápida? Me daría la impresión de que el siguiese haciendo uso del caché
Especifica si se debe utilizar el almacenamiento en caché de los resultados de la consulta. Si enable_result_cache_for_session está activado, Amazon Redshift busca una copia en caché válida de los resultados de la consulta cuando se envía una consulta. Si se encuentra una coincidencia en la caché de resultados, Amazon Redshift usa los resultados almacenados en caché y no ejecuta la consulta. Si enable_result_cache_for_session está desactivado, Amazon Redshift ignora la caché de resultados y ejecuta todas las consultas cuando se envían.
La clave es identificar que al estar prendido, el analiza primero si tiene ya ese resultado y lo intenta mostrar, por lo cual es más lento para el ejercicio de la clase ya que son valores iguales pero de tablas diferentes. Por otra parte cuando esta apagado simplemente ejecuta la centencia directamente, por eso para el ejercicio es más rápido.
Wow, increíble explicació. Muchas gracias!
set enable_result_cache_for_session to off;SELECTmax(lo_revenue),min(lo_revenue)FROM cust_sales_simple
WHERE c_custkey <100000;--349ms ,237ms
SELECTmax(lo_revenue),min(lo_revenue)FROM cust_sales_compuesto
WHERE c_custkey <100000;--125ms ,146ms
SELECTmax(lo_revenue),min(lo_revenue)FROM cust_sales_intercalado
WHERE c_custkey <100000;--397 ms ,179ms
-------------------------------set enable_result_cache_for_session to off;SELECTmax(lo_revenue),min(lo_revenue)FROM cust_sales_simple
WHERE c_region ='ASIA'AND c_mktsegment ='FURNITURE';--1.468ms,1.369 ms
SELECTmax(lo_revenue),min(lo_revenue)FROM cust_sales_compuesto
WHERE c_region ='ASIA'AND c_mktsegment ='FURNITURE';--2.586s, 770ms
SELECTmax(lo_revenue),min(lo_revenue)FROM cust_sales_intercalado
WHERE c_region ='ASIA'AND c_mktsegment ='FURNITURE';--303ms,104 ms
-----------set enable_result_cache_for_session to off;SELECTmax(lo_revenue),min(lo_revenue)FROM cust_sales_simple
WHERE d_date BETWEEN'01/01/1996'AND'01/14/1996'AND c_mktsegment ='FURNITURE'AND c_region ='ASIA';--1.415s, 115ms
SELECTmax(lo_revenue),min(lo_revenue)FROM cust_sales_compuesto
WHERE d_date BETWEEN'01/01/1996'AND'01/14/1996'AND c_mktsegment ='FURNITURE'AND c_region ='ASIA';--806 ms, 326ms
SELECTmax(lo_revenue),min(lo_revenue)FROM cust_sales_intercalado
WHERE d_date BETWEEN'01/01/1996'AND'01/14/1996'AND c_mktsegment ='FURNITURE'AND c_region ='ASIA';--236 ms, 112ms
La sentencia ENABLE_RESULT_CACHE_FOR_SESSION opera de la siguiente forma:
Si su valor es ON busca en cache algún resultado previamente calculado para el query ejecutado. Si su valor es OFF ejecuta el query directamente y obtiene un resultado nuevo.
ENABLE_RESULT_CACHE_FOR_SESSION - STACKOVERFLOW
Evaluando Algoritmos de Ordenamiento en Amazon Redshift
El uso de llaves de ordenamiento (SORT KEYS) es crucial para optimizar las consultas en Redshift, especialmente en tablas grandes y con consultas complejas. Los algoritmos de ordenamiento disponibles en Redshift incluyen COMPOUND e INTERLEAVED, cada uno diseñado para diferentes casos de uso. Evaluarlos correctamente asegura un rendimiento óptimo para tus necesidades específicas.
1. Tipos de Algoritmos de Ordenamiento
a. Llave de Ordenamiento Compuesta (COMPOUND SORTKEY)
Ordena físicamente los datos en el disco de manera secuencial, basándose en las columnas especificadas.
Ventajas:
Ideal para consultas que filtran o agrupan por la primera columna de la llave.
Bajo costo de mantenimiento.
Desventajas:
Menos eficiente si las consultas dependen de columnas secundarias en la llave.
No es flexible para patrones de consulta variados.
b. Llave de Ordenamiento Entrelazada (INTERLEAVED SORTKEY)
Distribuye el ordenamiento entre todas las columnas especificadas, optimizando el acceso a cualquiera de ellas.
Ventajas:
Más flexible para patrones de consulta variados.
Beneficia consultas que filtran por cualquier combinación de columnas en la llave.
Desventajas:
Mayor costo de mantenimiento (especialmente con inserciones y cargas masivas).
Menor eficiencia si la mayoría de las consultas dependen de una sola columna.
2. Métodos de Evaluación de Algoritmos
a. Pruebas de Rendimiento
Evalúa cada algoritmo mediante pruebas de rendimiento específicas para tu carga de trabajo.
**Crea Tablas de Prueba:**CREATE TABLE ventas_compound (
venta_id INT,
fecha DATE,
cliente_id INT,
total DECIMAL(10, 2)
)
COMPOUND SORTKEY (fecha, cliente_id);
CREATE TABLE ventas_interleaved (
venta_id INT,
fecha DATE,
cliente_id INT,
total DECIMAL(10, 2)
)
INTERLEAVED SORTKEY (fecha, cliente_id);
Una con llave compuesta.
Otra con llave entrelazada.
Carga los Datos: Utiliza datos representativos de tu carga de trabajo.COPY ventas_compound
FROM 's3://mi-bucket/ventas.csv'
CREDENTIALS 'aws_access_key_id=XXX;aws_secret_access_key=YYY'
CSV;
COPY ventas_interleaved
FROM 's3://mi-bucket/ventas.csv'
CREDENTIALS 'aws_access_key_id=XXX;aws_secret_access_key=YYY'
CSV;
Ejecuta Consultas de Prueba: Ejecuta las consultas más comunes y mide los tiempos de respuesta.EXPLAIN SELECT * FROM ventas_compound WHERE fecha = '2025-01-01';
EXPLAIN SELECT * FROM ventas_interleaved WHERE fecha = '2025-01-01';
b. Monitoreo de Uso
Utiliza las vistas del sistema de Redshift para monitorear el uso de las columnas en las consultas.
Consulta columnas utilizadas en escaneos:SELECT table_id, column, sum(scan_count) AS total_scans
FROM svl_query_summary
GROUP BY table_id, column
ORDER BY total_scans DESC;
Evalúa la distribución de datos y el rendimiento:SELECT table_id, diststyle, sortkey1, skew_sortkey1, rows
FROM svv_table_info
WHERE table_name = 'ventas';
Tablas pequeñas no se benefician significativamente de llaves de ordenamiento.
Tablas grandes con patrones de acceso predecibles suelen usar COMPOUND SORTKEY.
b. Frecuencia de Cargas de Datos
Si realizas muchas inserciones o cargas masivas, el costo de mantenimiento de INTERLEAVED SORTKEY puede ser prohibitivo.
c. Reclamo de Espacio y Optimización
Usa VACUUM y ANALYZE para optimizar la disposición física de los datos después de cambios significativos.
VACUUM ventas_compound;
ANALYZE ventas_compound;
Conclusión
La elección del algoritmo de ordenamiento depende de tus patrones de acceso y la flexibilidad que necesitas. Realiza pruebas y monitorea el impacto en el rendimiento para seleccionar la mejor estrategia para tu carga de trabajo en Amazon Redshift.
Apagar el cache: set enable_result_cache_for_session to off
Hice unas consultas para los registros con ID mayor a 500,000 de mayo de 1996, sector automóvil y con región de Medio Oriente y mientras más filtros se agregan más es la diferencia de las sort key tipo intercalado en el rendimiento
set enable_result_cache_for_session to off;select sum(lo_revenue)from cust_sales_simple
WHERE c_custkey >500000AND d_date BETWEEN'1996/05/01'AND'1996/05/30'AND c_mktsegment ='AUTOMOBILE'AND c_region ='MIDDLE EAST';-- tiempo con cache desactivado 1.345 s
select sum(lo_revenue)from cust_sales_compound
WHERE c_custkey >500000AND d_date BETWEEN'1996/05/01'AND'1996/05/30'AND c_mktsegment ='AUTOMOBILE'AND c_region ='MIDDLE EAST';-- tiempo con cache desactivado 710 ms
select sum(lo_revenue)from cust_sales_interleaved
WHERE c_custkey >500000AND d_date BETWEEN'1996/05/01'AND'1996/05/30'AND c_mktsegment ='AUTOMOBILE'AND c_region ='MIDDLE EAST';-- tiempo con cache desactivado 277 ms
muy clara esta clase
Mis tiempos en las queries:
set enable_result_cache_for_session to off;select max(lo_revenue),min(lo_revenue)from cust_sales_simple
where c_custkey <100000;--420ms/ 232ms
select max(lo_revenue),min(lo_revenue)from cust_sales_compuesto
where c_custkey <100000;--178ms/ 153ms
select max(lo_revenue),min(lo_revenue)from cust_sales_intercalable
where c_custkey <100000;--326/ 234ms
-------------------------------------------------select max(lo_revenue),min(lo_revenue)from cust_sales_simple
where c_region ='ASIA'and c_mktsegment ='FURNITURE';--8.847s/4.399s
select max(lo_revenue),min(lo_revenue)from cust_sales_compuesto
where c_region ='ASIA'and c_mktsegment ='FURNITURE';--7.931s/3.459s
select max(lo_revenue),min(lo_revenue)from cust_sales_intercalable
where c_region ='ASIA'and c_mktsegment ='FURNITURE';--4.761/539ms
---------------------------------------------------set enable_result_cache_for_session to off;select max(lo_revenue),min(lo_revenue)from cust_sales_simple
where d_date between '01/01/1996' and '01/14/1996'and c_mktsegment ='FURNITURE'and c_region ='ASIA';--1.254s/1.103s
select max(lo_revenue),min(lo_revenue)from cust_sales_compuesto
where d_date between '01/01/1996' and '01/14/1996'and c_mktsegment ='FURNITURE'and c_region ='ASIA';--9.191s/4.590s
select max(lo_revenue),min(lo_revenue)from cust_sales_intercalable
where d_date between '01/01/1996' and '01/14/1996'and c_mktsegment ='FURNITURE'and c_region ='ASIA';--5.221/ 404ms```