L'indexation de vues avec une expression de table commune
Donc, je viens de constater que SQL Server 2008 ne permet pas d'indice d'une vue avec une expression de table commune dans la définition, mais il vous permet de alter
la requête pour ajouter with schemabinding
dans la définition de la vue. Est-il une bonne raison à cela? Est-il judicieux pour une raison que je ne suis pas au courant de? J'étais sous l'impression que WITH SCHEMABINDING
s avait pour principal objectif de vous permettre d'indice vue
nouveau et amélioré avec plus de requêtes action
;with x
as
(
select rx.pat_id
,rx.drug_class
,count(*) as counts
from rx
group by rx.pat_id,rx.drug_class
)
select x.pat_id
,x.drug_class
,x.counts
,SUM(c.std_cost) as [Healthcare Costs]
from x
inner join claims as c
on claims.pat_id=x.pat_id
group by x.pat_id,x.drug_class,x.counts
Et le code pour créer l'index
create unique clustered index [TestIndexName] on [dbo].[MyView]
( pat_id asc, drug_class asc, counts asc)
- En aparté, même s'il était possible de l'indice de ce point de vue, l'ensemble de la colonne (
counts
) ne devrait pas être partie de l'unique définition de l'index.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas l'indice d'un point de vue avec une expression de table commune. Même si la vue peut ont
SCHEMABINDING
. Pensez-y de cette façon. Afin d'index d'un point de vue, il doit satisfaire à deux conditions (et beaucoup d'autres): (a) qu'il a été crééWITH SCHEMABINDING
et (b) qu'il ne contient pas de CTE. Afin de schemabind vue, il ne pas besoin à satisfaire à la condition qu'il ne contienne pas une expression de table commune.Je ne suis pas convaincu qu'il y a un scénario dans lequel un point de vue a un CTE et bénéficieront de cours d'indexation. C'est un périphérique à votre question, mais mon instinct me dit que vous essayez d'indice de ce point de vue, par magie, le rendre plus rapide. Une vue indexée n'est pas nécessairement plus vite qu'une requête sur les tables de base - il y a des restrictions pour une raison, et il y a seulement particulier les cas d'utilisation où ils font sens. Veuillez faire attention à ne pas seulement aveuglément tous les index de votre point de vue comme une magie "aller plus vite" bouton. Rappelez-vous aussi qu'une vue indexée nécessite un entretien. Donc, il va augmenter le coût de toutes les opérations DML dans votre charge de travail qui influent sur la table de base(s).
Schemabinding est pas juste pour l'indexation des points de vue. Il peut également être utilisé
sur des choses comme les fonctions définies par l'utilisateur pour l'aider à persuader le déterminisme, peut être utilisé sur
les vues et les fonctions à empêcher les modifications sur le schéma sous-jacent, et
dans certains cas, il peut améliorer les performances (par exemple, lorsqu'un fichier UDF est
pas lié à un schéma, l'optimiseur peut-être pour créer une table bobine de
manipuler tous les sous-jacents des modifications DDL). Merci donc de ne pas penser que c'est
bizarre que vous pouvez schéma lier un point de vue, mais vous ne pouvez pas indexer.
L'indexation d'une vue exige, mais la relation n'est pas réciproque.
Pour votre scénario spécifique, je vous recommande ceci:
Maintenant, vous pouvez créer une vue indexée juste fait une jointure entre ces deux vues indexées, et il va utiliser les index (vous pourriez avoir à utiliser
NOEXPAND
sur une édition inférieure, pas sûr):Maintenant, tout cela suppose qu'il vaut la peine de pré-regrouper cette information si vous exécutez cette requête rarement, mais les données sont modifiées beaucoup, il peut être préférable de ne PAS créer des vues indexées.
Également de noter que la
SUM(std_cost)
de laClaimSums
vue sera la même pour tous lespat_id
+drug_class
combinaison, puisque c'est seulement agrégées àpat_id
. Je pense qu'il y a peut-être undrug_class
dans leclaims
tableau qui devraient faire partie des critères de jointure trop, mais je ne suis pas sûr. Si c'est le cas, je pense que cela pourrait être réduites à une seule vue indexée.SCHEMABINDING
. Si elle faisait référence à trois ou quatre noms, cela ne devrait pas être possible.Cannot create index on MyDatabase because it references a CTE. Views referencing CTEs cannot be indexed Level 16
...quel que soit le Niveau 16 moyens. Je suis l'aide de SSMsCOUNT()
etSUM()
, pas seulement pour faire des requêtes sur un affichage plus rapide.Msg 10137, Level 16, State 1, Line 1
est le bon code d'erreur reçus lorsque j'ai essayé d'ajouter un index à une vue avec une expression de table communeWITH SCHEMABINDING
.