Geïndexeerde weergave
Een geheel nieuwe oplossing gebaseerd op Geïndexeerde weergaven is mogelijk.
Een geïndexeerde weergave is een weergave met een geclusterde index en de gegevens worden daadwerkelijk op schijf opgeslagen.
Zoals ik het begrijp, probeert u een totaal van aankopen per productitem te behouden in tblProduct
. Ik heb aangenomen dat ItemCode
is de PK van tblProduct en dat ItemName
is daar ook gedefinieerd (We kunnen MAX
niet gebruiken in een geïndexeerde weergave). Dus we kunnen een weergave als volgt definiëren:
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
We kunnen er dan een geclusterde index op maken om deze op schijf te bewaren. SQL Server houdt de index bij wanneer er een update van de basistabel plaatsvindt. Als er geen rijen meer zijn in de groepering (aangeduid door een telling van 0), wordt de rij verwijderd:
CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO
Als we er nu een vraag over willen stellen, kunnen we deze weergave overlaten op tblProducts
(links lid worden omdat er mogelijk geen aankopen zijn):
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;
We kunnen dit ook als een weergave definiëren (geen geïndexeerde, maar een standaardweergave), zodat de definitie overal bruikbaar is.
Opmerking over NOEXPAND
:
Als u geen SQL Server Enterprise of Developer Edition gebruikt, moet u de hint WITH (NOEXPAND)
gebruiken om het te dwingen de index te gebruiken, anders zal het de basis tblPurchase
. opvragen in plaats van. En zelfs in die edities is het het beste om NOEXPAND
. te gebruiken .
Zie dit artikel door Paul White hierover.