Vue d’ensemble
Bien que les optimisations d’E/S mentionnées ci-dessus puissent réduire considérablement le volume de données lu, elles partent toujours du principe que toutes les colonnes des lignes satisfaisant la clause
WHERE doivent être chargées avant d’exécuter des opérations comme le tri, l’agrégation ou LIMIT. Mais que se passe-t-il si certaines colonnes ne sont nécessaires que plus tard, ou si certaines données, bien qu’elles satisfassent la clause WHERE, ne sont en fait jamais nécessaires ?
C’est là qu’intervient la matérialisation paresseuse. Il s’agit d’une amélioration orthogonale qui complète la pile d’optimisations d’E/S :
- L’indexation, associée à
PREWHERE, garantit que seules les lignes correspondant aux filtres de colonnes de la clauseWHEREsont traitées. - La matérialisation paresseuse s’appuie sur cela en différant la lecture des colonnes jusqu’au moment où le plan d’exécution de la requête en a réellement besoin.
Même après le filtrage, seules les colonnes nécessaires à l’opération suivante — comme le tri — sont chargées immédiatement.
Les autres sont différées et, grâce à
LIMIT, ne sont souvent lues que partiellement, juste assez pour produire le résultat final. Cela rend la matérialisation paresseuse particulièrement puissante pour les requêtes Top N, où le résultat final peut ne nécessiter qu’une poignée de lignes de certaines colonnes, souvent volumineuses.
Un exemple concret
PREWHERE, une requête doit comporter des filtres : sur les colonnes de clé primaire pour l’indexation, et sur n’importe quelles colonnes pour PREWHERE.
La matérialisation paresseuse s’y superpose naturellement, mais contrairement aux autres optimisations mentionnées précédemment, elle peut aussi accélérer des requêtes sans aucun filtre sur les colonnes.
Prenons l’exemple de la requête suivante, qui recherche les avis Amazon ayant reçu le plus grand nombre de votes utiles, quelle que soit la date, le produit, la note ou le statut de vérification, et renvoie les 3 premiers avec leur titre, leur en-tête et leur texte intégral.
Commençons par exécuter la requête (avec des caches du système de fichiers à froid) avec la matérialisation paresseuse désactivée (à l’aide de query_plan_optimize_lazy_materialization) :
Query
Response
Query
Response
Comment confirmer la matérialisation paresseuse dans le plan d’exécution de la requête
EXPLAIN :