Wie zu umschreiben CROSS INNER JOIN GILT, um die Ansicht zu machen indexierten
-
28-09-2019 - |
Frage
Auf einem separaten Thread Ich habe ein funktionierendes Beispiel, wie mein gespeichert übersetzen proc auf eine Ansicht, die die Kundennamen Aufträge Mapping halten, wo Aufträge durch Komma getrennte Listen von Aufträgen sind, für keine Aufträge einschließlich NULL. Also für die Tabelle unten, ich brauche die folgenden in der Ansicht angezeigt werden:
Name Orders
'John' New Hat, New Book, New Phone
'Marry' NULL
Ich brauche die Ansicht zu indizieren, aber man kann es tun, wenn die SELECT-Abfrage in einer Ansicht hat NEHMEN und / oder Unterabfragen. Ist es möglich, diese Ansicht zu einer indizierten Sicht zu übersetzen?
create table Customers (CustomerId int, CustomerName VARCHAR(100))
create table Orders (CustomerId int, OrderName VARCHAR(100))
insert into Customers (CustomerId, CustomerName) select 1, 'John' union all select 2, 'Marry'
insert into Orders (CustomerId, OrderName) select 1, 'New Hat' union all select 1, 'New Book' union all select 1, 'New Phone'
go
create view OrderView as
select c.CustomerName, x.OrderNames
from Customers c
cross apply (select stuff((select ',' + OrderName from Orders o
where o.CustomerId = c.CustomerId for xml path('')),1,1,'')
as OrderNames) x
go
Lösung
Sie können diese Ansicht nicht machen indiziert.
Grundsätzlich sind Sie mit einer Aggregatfunktion hier (getarnt als CROSS APPLY
).
Die einzigen Aggregatfunktionen in einer indizierten Sicht erlaubt sind COUNT_BIG
und SUM
, weil sie über Set Addition und Subtraktion zu verteilen, die SUM(a UNION ALL b) = SUM(a) + SUM(b)
ist, SUM(a EXCEPT ALL b) = SUM(a) - SUM(b)
.
Diese Eigenschaft ist für den Index erforderlich wartbar sein.
Wenn ein neuer Datensatz eingefügt, aktualisiert oder aus der zugrundeliegenden Tabelle gelöscht, die ganze Sicht muss nicht neu bewertet werden. Der Wert des neuen Datensatzes wird gerade addiert oder subtrahiert aus dem Gesamtwert
Darüber hinaus ist ein COUNT_BIG
sollte auch ein Teil der Ansicht sein, Löschungen von Datensätzen zu verfolgen (wenn es 0
wird, sollte ein Datensatz aus der Sicht Index gelöscht werden).
Andere Tipps
Wenn Sie eine innere Verwendung kommen mit 1 = 1 wird die Bedingung erfüllen, und lassen Sie die Verbindung.
Wählen Sie * von x Exklusionsverknüpfung y auf 1 = 1