Vues indexées et optimisation

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…

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s