Les vues indexées sont un excellent vecteur d’optimisation et j’en suis un des ardents défenseurs !! Je les utilise depuis SQL Server 2000 pour optimiser des requêtes un peu complexes ou fréquemment utilisées. Le but de ce post n’est pas de détailler les vues indexées mais de présenter un problème qui m’est arrivé.
Lors d’une formation SQL Server, je présente comme d’habitude l’intérêt des vues indexées et on décide de faire une petite démo avec AdventureWorks. L’idée est d’optimiser la récupération des descriptions de produits. La vue est la suivante :
Create View [dbo].[vProdDesc]
WITH SCHEMABINDING
as
select p.name, d.description
from production.product p
inner join Production.ProductModelProductDescriptionCulture dc
on dc.ProductModelID = p.ProductModelID
and cultureid = 'fr'
inner join production.productdescription d
on d.ProductDescriptionID = dc.ProductDescriptionID
Je pose un index UNIQUE et CLUSTERED sur la vue et pour montrer l’utilisation de l’index j’exécute un simple SELECT sur la vue :
Select * From dbo.vProdDesc
Le plan d’exécution généré montre clairement que l’index n’est pas utilisé. J’utilise donc tous les grigris SQL en ma possession : DBCC FREEPROCCACHE, sp_recompile, table hint, mais rien n’y fait.
Un petit tour dans l’aide pour voir si je n’ai pas zappé quelquechose et je tombe sur une phrase annodine :
Indexed views can be created in any edition of SQL Server 2005. In SQL Server 2005 Enterprise Edition, the query optimizer automatically considers the indexed view. To use an indexed view in all other editions, the NOEXPAND table hint must be used.
Je n’ai pourtant jamais utiliser ce hint pour activer des vues indexées. Et pourtant, en l’ajoutant à ma requête, le plan d’exécution est correct et tire bénéfice de l’index.
Select * From dbo.vProdDesc WITH (NOEXPAND)
Un coup d’oeil sur la version :
Select @@version
Microsoft SQL Server 2005 - 9.00.3054.00 (Intel X86) Mar 23 2007 16:28:52 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 6.0 (Build 6000: )
Conclusion : l’édition Developer est bien bridée par rapport à la version Enterprise. Et l’effet de bord à cela c’est que l’on ne peut pas utiliser de vue indexées dites « techniques » (ie. utilisées implicitement par l’optimiseur de requêtes) car on ne peut pas préciser l’option NOEXPAND si la vue n’est pas utilisée directement.
Ce que je ne comprends pas c’est qu’il me semblait toujours avoir développé sur des Developer Edition or je n’ai jamais rencontré cet effet de bord. Donc je commence à croire que c’était des Enterprise… Ah le luxe, quand tu nous tiens…