astuce noexpand pour l'édition et les performances non-entreprenantes

11

Je dois utiliser des vues indexées pour atteindre les performances. Comme je peux le voir sur cette table de comparaison, l'édition standard ne prend pas en charge les vues indexées. Mais BOL dit:

Les vues indexées peuvent être créées dans n'importe quelle édition de SQL Server. Dans SQL Server Enterprise, l'optimiseur de requêtes prend automatiquement en compte la vue indexée. Pour utiliser une vue indexée dans toutes les autres éditions, l'indicateur de table NOEXPAND doit être utilisé.

Alors ça va marcher (je parle de performance)

select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals)

sur l'édition standard de SQL Server ainsi que cela fonctionne

select * from dbo.OrderTotals

sur l'Enterprise?

Voici le code pour la vue:

CREATE VIEW dbo.OrderTotals
WITH SCHEMABINDING
AS
select 
    OrderId     =   r.OrderId                   
  , TotalQty            =   SUM(r.Quantity)
  , TotalGrossConsid    =   SUM(r.Price * r.Quantity)
  , XCount      =   COUNT_BIG(*)
from dbo.Order r
group by r.OrderId

CREATE UNIQUE CLUSTERED INDEX IXCU_OrderTotals ON OrderTotals (OrderId)
garik
la source

Réponses:

14

La différence est que l'édition Enterprise sans l'indicateur peut décider de ne pas utiliser la vue indexée mais les tables de base à la place.

Mon expérience personnelle est que SQL Server est un peu braindead dans ce domaine. Je dois presque toujours utiliser l'indication: la requête est plus rapide avec beaucoup moins d'E / S même si le plan "semble" pire avec une analyse sur la vue et non sur l'index recherchée sur les tables de base. Et il fonctionne également de manière plus cohérente

YMMV bien sûr :-)

Donc, pour répondre, cela fonctionnera (devrait?) De la même manière en fonction de ce que j'ai vu. D'autres personnes peuvent avoir des expériences différentes et je suis intéressé par d'autres réponses

Pour éviter d'utiliser l'indicateur partout, vous pouvez encapsuler la vue indexée dans une autre vue avec l'indice: les indices se propageant vers toutes les requêtes externes auront automatiquement NOEXPAND.

gbn
la source
J'ai obtenu "Les indications d'index ne peuvent pas être spécifiées dans un objet lié au schéma" lorsque j'ai essayé de créer une vue externe avec la liaison de schémas comme select * from OrderTotals with (noexpand, index = IXCU_xxx). :)
garik
2
@garik: Je n'aurais que NOEXPAND, pas l'index d'index. Il n'y a de toute façon qu'un index: il est en cluster donc table scan = index scan
gbn
pas de discussion. fermé :)
garik
Woaaa ... intégrant NOEXPAND ... intelligent, luv it ...
Jérôme Verstrynge