ProgrammationDéveloppeur Backend

Qu'est-ce qu'une vue indexée (Indexed View) en SQL, comment est-elle mise en œuvre, à quoi sert-elle et quels sont les pièges à éviter lors de son utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Une vue indexée (Indexed View, vue matérialisée avec index) est une vue (VIEW) pour laquelle un index unique cluster a été créé. Cela permet de stocker physiquement les résultats de la requête sur le disque et d'utiliser l'index pour accélérer l'accès.

Avantages:

  • Récupération rapide des données agrégées ou fréquemment utilisées.
  • Réduit la charge des calculs en temps réel.

Limitations:

  • Tous les types de requêtes ne sont pas pris en charge (par exemple, il est impossible d'utiliser les types de données TEXT, NTEXT, IMAGE, certaines fonctions).
  • Coûts supplémentaires pour maintenir l'index lors des modifications dans la table de base.
  • Nécessite le respect d'un ensemble de règles strictes lors de la déclaration.

Exemple de code

CREATE VIEW dbo.SalesSummary WITH SCHEMABINDING AS SELECT SalesPersonID, COUNT_BIG(*) AS SalesCount, SUM(TotalDue) AS TotalDue FROM dbo.Sales GROUP BY SalesPersonID; GO CREATE UNIQUE CLUSTERED INDEX idx_SalesSummary ON dbo.SalesSummary (SalesPersonID);

Question piège.

Q : Toutes les vues permettent-elles de créer un index (clusterisé) ?

R : Non, seules les VIEW qui respectent pleinement les restrictions peuvent être indexées (par exemple, pas de références externes, fonctions agrégées compatibles, etc.). Sinon, la requête de création d'index renverra une erreur.

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


Histoire

Sur un projet réel dans un système bancaire, il était nécessaire d’accélérer les requêtes sur des rapports agrégés. Une vue indexée a été créée sans analyser la charge sur les mises à jour des tables. Lors d'opérations massives d'insertion, la performance de la table principale a chuté en raison des coûts significatifs de mise à jour de l'index de la vue.


Histoire

Un spécialiste pensait à tort qu'il était possible d'indexer une VIEW avec un JOIN sur une table externe et la fonction GETDATE(). La requête de création d'index s'est soldée par une erreur "Impossible de créer un index sur une vue avec des fonctions non déterministes". Une journée a été perdue pour corriger l'architecture du projet.


Histoire

Dans un grand projet e-commerce, la mise à jour des données dans la table de base "Products" a causé des blocages. La raison en était la gestion incorrecte des transactions en présence d'une vaste vue indexée, dans laquelle l'agrégation touchait des millions de lignes.