En SQL, il existe deux types de vues :
Les vues ordinaires sont pratiques pour abstraire la complexité, simplifier l'accès et combiner des données provenant de plusieurs sources. Elles n'accélèrent pas les requêtes, car elles se forment toujours à la volée.
Les vues matérialisées offrent un gain de performance pour les rapports complexes et l'analyse, où il est important de ne pas attendre les agrégations et les jointures à chaque fois. Elles doivent être actualisées manuellement ou selon un horaire pour que les données ne deviennent pas obsolètes.
CREATE VIEW active_users AS SELECT id, name FROM users WHERE status = 'active';
CREATE MATERIALIZED VIEW active_users_agg AS SELECT country, COUNT(*) as cnt FROM users WHERE status = 'active' GROUP BY country; -- Pour mettre à jour : REFRESH MATERIALIZED VIEW active_users_agg;
Peut-on mettre à jour les données dans une VIEW et comment cela dépend-il du type de VIEW ?
On pense souvent à tort que les VIEW sont totalement identiques aux tables en termes de mise à jour. EN RÉALITÉ :
REFRESH, sinon un décalage des données se produit.Histoire 1
Un rapport BI était construit via une VIEW ordinaire avec plusieurs JOIN et agrégats. Après une augmentation de la charge, le temps de génération du rapport est passé à plusieurs dizaines de minutes. Un analyste système a proposé une vue matérialisée, ce qui a instantanément réduit le temps à quelques secondes, car les données ont commencé à être stockées dans une table distincte.
Histoire 2
Un développeur, lors de la migration vers Oracle, a tenté de faire un UPDATE à travers une VIEW ordinaire, ce qui a provoqué l'erreur : "view with group by is not updatable". La raison était l'utilisation de GROUP BY dans la vue.
Histoire 3
Dans une entreprise, ils oubliaient de mettre à jour la vue matérialisée après l'importation de nouvelles données, ce qui a conduit à un décalage des rapports entre différents utilisateurs, car l'analyse travaillait avec de vieilles données provenant de cette VIEW. Après, un REFRESH automatique a été ajouté selon un horaire.