sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik de tblPurchase- en tblProductStock-tabel behouden zonder te laten vallen. (Ik moet zowel de tabel als de waarde permanent houden zonder te laten vallen)

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.




  1. Hoe kan ik een array met booleaanse waarden opslaan in een MySql-database?

  2. Kan geen instructies voor gegevensmanipulatie uitgeven met executeQuery()

  3. MySQL/PHP-fout:[2002] Slechts één gebruik van elk socketadres (protocol/netwerkadres/poort) is normaal gesproken toegestaan

  4. Transactielogboekbewaking