SQL Server : Vues indexées y compris sur Edition Express
Beaucoup de personnes croient que seule l'édition Enterprise supporte les vues indexées. Ceci n'est pas vrai, elle supporte les vues indexées de manière différentes des autres.
La vue indexée a pour effet de matérialiser les données ; on prend le résultat de la requête et on le stocke et on le maintient à jour en fonction des modifications des tables de base.
Le très gros avantage de l'utilisation des vues indexées sous SQL Server edition Enterprise, c'est que leur utilisation est totalement automatique. Vous n'avez rien d'autre à faire qu'à créer la vue indexée, l'optimiseur de requête l'utilise dès qu'un requête à une définition proche de celle de la vue. Ceci est très pratique si vous ne pouvez pas toucher au code des requêtes.
Voici un exemple où la vue indexée se révèle intéressante. Je suis sur la base exemple AdventureWorks.
CREATE VIEW v1
WITH SCHEMABINDING
AS
SELECT
Product.Name,
Customer.AccountNumber,
SUM(SalesOrderDetail.OrderQty) AS SumOrderQty,
COUNT_BIG(*) AS CB
FROM Sales.SalesOrderHeader
INNER JOIN Sales.SalesOrderDetail ON SalesOrderHeader.SalesOrderID = Sales.SalesOrderDetail.SalesOrderID
INNER JOIN Production.Product ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID
INNER JOIN Sales.Customer ON Sales.SalesOrderHeader.CustomerID = Sales.Customer.CustomerID
AND Sales.SalesOrderHeader.CustomerID = Sales.Customer.CustomerID
GROUP BY Product.Name, Customer.AccountNumber
Dans l'exemple je cumule les jointures et les agrégats le domaine de prédilection des vues indexées. Pour que cette vue deviennent une vue indexée, j'ai juste à ajouter un index.
CREATE UNIQUE CLUSTERED INDEX IX_v1 ON v1(Name, AccountNumber)
Les données sont maintenant matérialisées.
Sur SQL Server édition Enterprise vous n'avez rien de plus à faire, dès qu'une requête se rapproche suffisamment de la définition de la vue le moteur va automatiquement utiliser les données de la vue indexée.
Par contre sur les autres éditions il faut requêter directement la vue et forcer l'utilisation de l'index par NOEXPAND.
-- Execute la requête de la vue
-- On remplace le nom de la vue par sa définition
-- Comme on le fait pour une vue normale
SELECT * FROM v1
-- Renvoie les données de la vue indexée
-- Dans ce cas on demande explicitement à lire les données
-- de l'index créée précédement
SELECT * FROM v1 WITH(NOEXPAND)
A titre de comparaison la 1ère requête traite environ 20 Mo de donnée, met 13 secondes à s'exécuter (dont 8 par le CPU). La seconde (qui utilise donc les données matérialisées) traite seulement 6 Mo de données en 4 secondes (dont 1 par le CPU). Le gain est très net.
Petit conseil, avant de vous lancer dans la création de vues indexées, lisez l'aide en ligne à ce sujet. Il y a en effet enormément de restriction quant aux requête qu'il est possible d'utilser dans une vue indexée.
Et tous ces tests ont été réalisés avec SQL Server Express :o)
Bon tests et bon dev…
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :