Módulo 11 de 12 · CTEs

�¡ Optimización de CTEs

MATERIALIZED vs NOT MATERIALIZED ” cómo el planner ejecuta tus CTEs

💡 Piénsalo así: MATERIALIZED = tomar una foto del resultado y guardarla. Si la CTE se usa varias veces, la foto evita recalcular. NOT MATERIALIZED = integrar la CTE como si fuera una subconsulta ” el planner la optimiza junto con el resto de la consulta. En PG 18, el planner decide automáticamente.

🎯 ¿Qué aprenderás?

🧠 Quiz: ¿Materializado o no?

Haz clic en cada optimización para conocer cuándo usarla:

📸MATERIALIZED ” CTE se ejecuta una vez y se cachea
�… Úsalo cuando: la CTE es costosa y se referencia MÚLTIPLES VECES en la consulta principal. Ej: WITH ventas_mes AS MATERIALIZED (SELECT ...) SELECT * FROM ... WHERE total > (SELECT AVG(...) FROM ventas_mes).
� ï¸ Desventaja: ocupa memoria y siempre se ejecuta completa, aunque la consulta principal solo necesite parte.

Que aprenderas?

Optimizar CTEs evitando la materializacion innecesaria con NOT MATERIALIZED.
Usar EXPLAIN ANALYZE para ver si un CTE se materializa o se inyecta.
Elegir entre CTE materializado (una sola ejecucion) e inyectado (flexibilidad).
Aplicar estrategias de optimizacion segun el caso de uso.
🔗NOT MATERIALIZED ” CTE se fusiona con la consulta externa
�… Úsalo cuando: la CTE se referencia UNA SOLA VEZ o cuando el planner puede aplicar filtros directamente. Ej: WITH clientes_vip AS NOT MATERIALIZED (SELECT * FROM clientes WHERE compras > 10000) SELECT * FROM clientes_vip WHERE ciudad = 'Madrid'.
� ï¸ Desventaja: si la CTE se usa varias veces, se ejecuta múltiples veces.
🤖PG 18: Decisión automática del planner
�… Desde PostgreSQL 18, el planner puede decidir automáticamente si materializar o no. Usa `optimizer_decision` para CTEs. Si no estás seguro, DEJA QUE PG DECIDA.
📊 Puedes verificar con EXPLAIN (ANALYZE, BUFFERS) si la CTE se materializó.
💬 Explora las 3 opciones de optimización de CTEs

🏅 Optimization Master 🏅

¡Optimización de CTEs dominada!

📌 Resumen del módulo