2010-01-07 3 views
3

Afin d'améliorer les performances d'une requête, j'ai créé une vue indexée dénormalisée qui contient certaines des informations dont j'ai besoin de faire un rapport. Quand je n'ai pas obtenu les gains de performance que j'avais espérés, j'ai créé une version table de ma vue avec des index et j'ai obtenu des performances nettement meilleures.Mieux pour les performances SQL Query d'utiliser une table dénormalisée réelle avec des index plutôt qu'une vue indexée?

Je dois noter que lorsque je crée ma vue, il y a beaucoup d'ISNULL dans le SELECT. Je sais que ceux-ci peuvent nuire à la performance si ces colonnes étaient jointes régulièrement, mais j'avais l'impression que ce serait bien si la vue était indexée. Les ISNULL pourraient-ils être le problème?

Répondre

4

Avez-vous indexé les colonnes sur lesquelles vous étiez en train de sélectionner? Si vous n'avez pas d'index de couverture sur la vue indexée pour votre requête, vous trouverez certainement une table plus rapide. Si vous le faites, cependant, il ne devrait y avoir aucune différence réelle. Exemple:

CREATE VIEW dbo.denormalized 
WITH SCHEMABINDING 
AS 
    SELECT A.id, 
      A.col1, 
      A.col2, 
      ISNULL(B.col3, '') col3 
    FROM dbo.A LEFT JOIN dbo.B ON A.Bid = B.id 
GO 

CREATE UNIQUE CLUSTERED INDEX UIX_denormlaized 
ON dbo.denormalized (id) 

Jusqu'ici tout va bien. Maintenant, nous essayons de sélectionner de ce point de vue comme suit:

SELECT id, col3 FROM denormalized 

La seule des données conservées pour ce point de vue est l'index sur la colonne ID - le reste doit être séance d'entraînement à la volée. L'ISNULL est donc calculé à nouveau pour chaque ligne. Toutefois, si l'on ajoute cet indice:

CREATE INDEX IX_denormalized 
ON dbo.denormalized (id, col3) 

alors la même requête est servi de l'index persistant - beaucoup plus rapide, en fait des performances équivalentes à la sélection d'une table.

+0

La table et la vue correspondaient exactement l'une à l'autre. Index et tout. La performance n'aurait-elle pas dû être la même? –

+0

Non. Voir l'exemple ci-dessus. –

+0

Très bonne explication. Je vous remercie! –

1

Qu'est-ce SQL Server SKU? Seule Enterprise Edition prend en compte les vues indexées dans le plan de requête. Standard Edition ne considère pas la vue indexée, sauf si la sélection provient de la vue et utilise un indicateur NOEXPAND.

Mise à jour

Depuis que je suis arrivé déjà deux commentaires indiquant que c'est de savoir UTILE, je relie la page MSDN correspondant Resolving Indexes on Views:

vues indexées peuvent être créées dans une édition de Serveur SQL. Dans SQL Server Enterprise, l'optimiseur de requête considère automatiquement la vue indexée . Pour utiliser une vue indexée dans toutes les autres éditions, l'indicateur NOEXPAND doit être utilisé.

+0

C'est EE. Bon à savoir sur l'indice NOEXPAND cependant. –

+0

+1: Très intéressant à savoir –

Questions connexes