Indizierte Ansicht
Eine völlig neue Lösung basierend auf Indizierte Ansichten ist möglich.
Eine indizierte Ansicht ist eine Ansicht, die einen geclusterten Index enthält, und die Daten werden tatsächlich auf der Festplatte gespeichert.
Soweit ich weiß, versuchen Sie, eine Summe der Einkäufe pro Produktelement in tblProduct
zu speichern . Ich habe angenommen, dass ItemCode
ist die PK von tblProduct und diesem ItemName
ist auch dort definiert (Wir können MAX
nicht verwenden in einer indizierten Ansicht). Wir können also eine Ansicht wie folgt definieren:
CREATE VIEW dbo.vwTotalPurchases
WITH SCHEMABINDING -- must be schema bound, we cannot change underlying columns after creation
AS
SELECT
ItemCode,
SUM(Quantity) QuantityPurchased,
COUNT_BIG(*) CountPurchases -- if we group, must have count also, so that rows can be maintained
FROM dbo.tblPurchase -- must use two-part names
GROUP BY itemCode;
GO
Wir können dann einen gruppierten Index darauf erstellen, um ihn auf der Festplatte zu speichern. SQL Server verwaltet den Index bei jeder Aktualisierung der Basistabelle. Wenn es keine Zeilen mehr in der Gruppierung gibt (gekennzeichnet durch den Zählerstand 0), wird die Zeile gelöscht:
CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO
Wenn wir es jetzt abfragen wollen, können wir diese Ansicht links mit tblProducts
verknüpfen (beitreten links, da möglicherweise keine Käufe vorhanden sind):
SELECT
p.ItemCode,
p.ItemName,
ISNULL(tp.QuantityPurchased, 0) QuantityPurchased,
ISNULL(tp.CountPurchases, 0) CountPurchases
FROM tblProducts p
LEFT JOIN vwTotalPurchases tp WITH (NOEXPAND) ON tp.ItemCode = p.ItemCode;
Wir können dies auch als Ansicht definieren (keine indizierte Ansicht, sondern eine Standardansicht), sodass die Definition überall verwendbar ist.
Hinweis zu NOEXPAND
:
Wenn Sie nicht SQL Server Enterprise oder Developer Edition verwenden, müssen Sie den Hinweis WITH (NOEXPAND)
verwenden um es zu zwingen, den Index zu verwenden, sonst wird es die Basis tblPurchase
abfragen stattdessen. Und selbst in diesen Editionen ist es am besten, NOEXPAND
zu verwenden .
Siehe diesen Artikel von Paul White dazu.