Descripción general
Aunque las optimizaciones de E/S mencionadas pueden reducir significativamente la cantidad de datos leídos, siguen partiendo de que todas las columnas de las filas que cumplen la cláusula
WHERE deben cargarse antes de ejecutar operaciones como la ordenación, la aggregation o LIMIT. Pero ¿qué ocurre si algunas columnas no se necesitan hasta más adelante, o si ciertos datos, pese a cumplir la cláusula WHERE, no llegan a necesitarse en absoluto?
Ahí es donde entra la materialización diferida. Se trata de una mejora ortogonal que completa el conjunto de optimizaciones de E/S:
- La indexación, junto con
PREWHERE, garantiza que solo se procesen las filas que coinciden con los filtros de columna de la cláusulaWHERE. - La materialización diferida amplía este enfoque al aplazar la lectura de columnas hasta que el plan de ejecución de la consulta realmente las necesite.
Incluso después del filtrado, solo se cargan de inmediato las columnas necesarias para la siguiente operación, como la ordenación.
Las demás se posponen y, debido a
LIMIT, a menudo solo se leen parcialmente, lo justo para producir el resultado final. Esto hace que la materialización diferida sea especialmente potente para las consultas Top N, donde el resultado final puede requerir solo un puñado de filas de determinadas columnas, a menudo grandes.
Un ejemplo práctico
PREWHERE, una consulta necesita filtros: en las columnas de la clave primaria para la indexación y en cualquier columna para PREWHERE.
La materialización diferida se integra limpiamente con estas optimizaciones, pero, a diferencia de las otras optimizaciones mencionadas antes, también puede acelerar consultas sin ningún filtro de columna.
Considere la siguiente consulta de ejemplo, que encuentra las reseñas de Amazon con el mayor número de votos útiles, independientemente de la fecha, el producto, la calificación o el estado de verificación, y devuelve las 3 primeras junto con su título, encabezado y texto completo.
Primero, ejecute la consulta (con las cachés del sistema de archivos en frío) con la materialización diferida desactivada (mediante query_plan_optimize_lazy_materialization):
Query
Response
Query
Response
Cómo confirmar la materialización diferida en el plan de ejecución de la consulta
EXPLAIN: