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