web-dev-qa-db-fra.com

Pourquoi voudriez-vous mettre un index sur une vue?

Microsoft SQL Server vous permet d'ajouter un index à une vue, mais pourquoi voudriez-vous procéder ainsi? 

D'après ce que je comprends, une vue n'est en réalité qu'une simple requête, c'est-à-dire que si je dis SELECT * FROM myView, je dis vraiment SELECT * FROM (la requête de myView)

Il semble que les index sur les tables sous-jacentes seraient ceux qui importent le plus. Alors, pourquoi voudriez-vous un index séparé sur la vue?

36
Slider345

Si la vue est indexée, les requêtes auxquelles il est possible de répondre à l'aide de l'index uniquement n'auront jamais besoin de faire référence aux tables sous-jacentes. Cela peut entraîner une amélioration considérable des performances.

Essentiellement, le moteur de base de données conserve une version "résolue" de la requête (ou plutôt son index) lorsque vous mettez à jour les tables sous-jacentes, puis utilisez cette version résolue plutôt que les tables d'origine lorsque cela est possible.

Voici un bon article dans Database Journal.

34
Larry Lustig

Microsoft SQL Server vous permet d'ajouter un index à une vue, mais pourquoi voudriez-vous procéder ainsi? 

Pour accélérer les requêtes.

D'après ce que je comprends, une vue n'est en réalité qu'une simple requête, c'est-à-dire que si je dis SELECT * FROM myView, je dis vraiment SELECT * FROM (la requête de myView)

Pas toujours.

En créant un index clusterisé sur une vue, vous matérialisez la vue et les mises à jour des tables sous-jacentes mettent physiquement à jour la vue. Les requêtes sur cette vue peuvent ou non accéder aux tables sous-jacentes.

Toutes les vues ne peuvent pas être indexées.

Par exemple, si vous utilisez GROUP BY dans une vue, pour qu’elle soit indexable, elle doit contenir un COUNT_BIG et toutes ses fonctions d’agrégation doivent être distribuées sur UNION ALL (seuls SUM et COUNT_BIG sont réellement). Cela est nécessaire pour que l'index puisse être mis à jour et la mise à jour des tables sous-jacentes pourrait mettre à jour la vue rapidement.

4
Quassnoi

le lien suivant fournit des informations mieux formulées que ce que je peux dire, en particulier dans la section relative aux augmentations de performances. J'espère que ça aide

http://technet.Microsoft.com/en-us/library/cc917715.aspx

3
Daniel Casserly

Vous créez un index sur une vue pour la même raison que sur une table de base: pour améliorer les performances des requêtes sur cette vue. Une autre raison est d'implémenter une contrainte d'unicité que vous ne pouvez pas appliquer aux tables de base. SQL Server ne permet malheureusement pas de créer des contraintes sur les vues.

0
nvogel