Die Indizierung von Ansichten mit einem CTE
So, ich habe gerade herausgefunden, dass SQL Server 2008 lässt Sie nicht index a Ansicht mit einem Tabellenausdruck in der definition, aber es ermöglicht Ihnen alter
die Abfrage hinzufügen with schemabinding
in der view-definition. Gibt es einen guten Grund dafür? Macht es Sinn, für einige Grund ich bin bewusst? Ich hatte den Eindruck, dass WITH SCHEMABINDING
s Hauptzweck war, um Ihnen zu erlauben index a Ansicht
neue und verbesserte mit mehr Abfrage Aktion
;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
Und den code, um den index zu erstellen
create unique clustered index [TestIndexName] on [dbo].[MyView]
( pat_id asc, drug_class asc, counts asc)
Nebenbei, selbst wenn es möglich wäre, diese index-Ansicht, die aggregierte Spalte (
counts
) sollte nicht Teil der eindeutigen index definition.InformationsquelleAutor wootscootinboogie | 2013-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht indizieren eine Ansicht mit einem Tabellenausdruck. Obwohl die Ansicht kann haben
SCHEMABINDING
. Denken Sie an es auf diese Weise. Um den index einer Sicht, muss es zwei Bedingungen erfüllen (und viele andere): (a) dass es erstellt wurdeWITH SCHEMABINDING
und (b) dass es sich nicht enthalten, eine CTE. Um schemabind Blick, es tut nicht müssen die Bedingung erfüllen, dass es keinen Allgemeinen Tabellenausdruck enthalten.Ich bin nicht davon überzeugt, es gibt ein Szenario, wo ein Blick hat einen CTE und profitieren indiziert. Dies wird als Peripherie, zu Ihrer eigentlichen Frage, aber mein Instinkt ist, dass Sie versuchen, diese index-Ansicht, um auf Magische Weise machen es schneller. Eine indizierte Sicht ist nicht unbedingt gehen, um schneller als eine Abfrage für die Tabellen der Basis - Einschränkungen gibt es für einen Grund, und es gibt nur in bestimmten Fällen verwenden, wo Sie Sinn machen. Bitte seien Sie vorsichtig, nicht einfach blind index alle Ihre Ansichten, wie ein Zauber "schneller" - Taste. Denken Sie auch daran, dass eine indizierte Sicht erfordert Wartung. So wird es erhöhen die Kosten der jede und alle DML-Operationen in Ihrer Arbeitsauslastung, die Auswirkungen auf die Basistabelle(N).
Schemabinding ist nicht nur für die Indizierung von Ansichten. Es kann auch verwendet werden
auf Dinge wie UDFs zu helfen, zu überzeugen Determinismus, können verwendet werden
Ansichten und Funktionen um zu verhindern, dass änderungen an den zugrunde liegenden schema und der
in einigen Fällen können die performance verbessern (zum Beispiel, wenn eine UDF-Datei ist
nicht schema-gebunden ist, kann der Optimierer haben, erstellen Sie eine Tabelle spool in
behandeln die zugrunde DDL-änderungen). Also bitte nicht denken, dass es ist
seltsam, dass man schema-binden ein Blick, Sie können Sie aber nicht indizieren.
Die Indizierung einer Ansicht erfordert es, aber die Beziehung ist nicht gegenseitig.
Für Ihre spezifischen Szenario, ich empfehle dieses:
Erstellen Sie jetzt ein nicht-indizierten Sicht, die nicht einfach ein join zwischen diesen beiden indizierten sichten und es zu nutzen Indizes (Sie können die Nutzung
NOEXPAND
auf eine niedrigere edition, nicht sicher):Nun, dies alles setzt Voraus, dass es sich lohnt, vorab aggregieren diese Informationen - wenn Sie diese Abfrage ausführen selten, aber die Daten geändert werden, eine Menge, kann es besser sein, NICHT indizierten sichten erstellen.
Beachten Sie auch, dass die
SUM(std_cost)
von derClaimSums
Ansicht wird das gleiche für jedespat_id
+drug_class
Kombination, da es nur aggregiert für diepat_id
. Ich denke, es könnte eindrug_class
imclaims
Tabelle, die Teil der join-Kriterien auch, aber ich bin mir nicht sicher. Wenn das der Fall ist, ich denke, dies könnte reduziert werden auf eine einzige indizierte Sicht.Ich glaube nicht, dass das das Szenario ist, da die OP war in der Lage, ändern Sie die Ansicht und fügen Sie
SCHEMABINDING
. Wenn es verwiesen wird, drei - oder vier-Teil-Namen, sollte dies nicht möglich sein.Als ich versuchte, verwenden Sie einen Allgemeinen Tabellenausdruck in eine Ansicht, ich wollte schemabind ich habe den Fehler
Cannot create index on MyDatabase because it references a CTE. Views referencing CTEs cannot be indexed Level 16
...was auch immer Ebene 16 bedeutet. Ich bin mit SSMsSie hatten Recht in Ihrer intuition, die ich habe versucht, es schneller zu machen. Plus erlernen, würde ich nie ausprobiert Indizierung Blick und wollte nur noch, um meine Hände schmutzig zu machen.
Sie sollten beginnen, durch Lesen Dinge wie Entwerfen von Indizierten Sichten statt nur versuchen, einen index hinzuzufügen, um einige der anzeigen, die Sie herumliegen haben und hoffen, dass es macht es schneller. Sie sind in der Regel verwendet für die pre-Aggregation Dinge wie
COUNT()
undSUM()
, nicht nur, um Abfragen auf einem Blick schneller.InformationsquelleAutor Aaron Bertrand