2009-06-01 6 views
3

J'utilise une vue ("UsersActive") contre ma table ("Utilisateurs"). La vue n'a qu'un seul filtre, elle vérifie si DateTime Users.DeletedOn est NULL; il contient essentiellement tous les utilisateurs qui ne sont pas supprimés.SQL: Vue par rapport à la table - les requêtes sur la vue utilisent-elles toujours les index de table?

Si j'exécute maintenant des requêtes Linq par rapport à la vue au lieu de la table, vont-elles toujours utiliser les index de la table ou dois-je créer des index spéciaux pour la vue? Dans ma compréhension, la vue est rien d'autre qu'une requête prédéfinie et devrait fonctionner comme si j'Interrogation ceci directement:

SELECT * FROM utilisateurs WHERE DeletedON = NULL

Mon hypothèse que les index de la table sous-jacente sera toujours utilisé correctement?

+0

hypothèse Yoyur est correcte :) – Arvo

Répondre

5

La plupart du temps, SQL Server Query Optimizer est suffisamment intelligent pour utiliser les index sur la table de base. Vous pouvez le voir en regardant les plans de requête.

Si vous disposez d'une édition entreprise de SQL Server, vous pouvez également utiliser des vues indexées.

-1

La vue si elle n'est pas indexée sera régénérée à chaque fois en utilisant la requête qui la définit. Si la table de cette requête est indexée, les index de la table seront utilisés.

Vous pouvez également indexer votre vue, auquel cas l'ensemble de données sera validé sur le disque physique et vous aurez deux ensembles d'index.

+0

? Je ne sais pas pourquoi j'ai eu une downvote pour ça ??? – jfrobishow

2

Les vues sont assez transparentes directement aux instructions SQL sous-jacentes. C'est une bonne hypothèse de conception fiable.

1

Une vue indexée est très différente d'une vue non indexée.

Une vue peut effectivement être développée en ligne par le moteur, de sorte que tous les index de table qui sont déterminés par l'optimiseur peuvent être utilisés.

Une vue indexée matérialise (et tient à jour) un index. Ceci est disponible pour les utilisateurs de la vue, mais ne peut toujours pas être utilisé.

Une note supplémentaire basée sur votre exemple - un index peut ne pas être utilisé aussi efficacement sur les critères NULL que sur les colonnes d'indicateur ou de code.

0

Très probablement, vous devez réécrire votre requête:

SELECT * FROM utilisateurs WHERE IS NULL DeletedON

DeletedON = NULL ne sera pas vrai même si DeletedON IS NULL

Questions connexes