Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je conserver les tables tblPurchase et tblProductStock sans chute. (J'ai besoin de garder à la fois la table et la valeur permanentes sans chute)

Vue indexée

Une toute nouvelle solution basée sur Vues indexées est possible.

Une vue indexée est une vue qui contient un index clusterisé et les données sont en fait stockées sur le disque.

Si je comprends bien, vous essayez de conserver une somme d'achats par article de produit stockée dans tblProduct . J'ai supposé que ItemCode est le PK de tblProduct et que ItemName y est également défini (nous ne pouvons pas utiliser MAX dans une vue indexée). Nous pouvons donc définir une vue comme celle-ci :

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

Nous pouvons ensuite créer un index clusterisé dessus pour le conserver sur le disque. SQL Server conservera l'index chaque fois qu'une mise à jour de la table de base se produit. S'il n'y a plus de lignes dans le groupement (identifié par le nombre égal à 0), la ligne est supprimée :

CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO

Maintenant, si nous voulons l'interroger, nous pouvons joindre à gauche cette vue sur tblProducts (joindre à gauche car il se peut qu'il n'y ait pas d'achats) :

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;

Nous pouvons également définir cela comme une vue (pas une vue indexée, mais une vue standard) afin que la définition soit utilisable n'importe où.

Remarque sur NOEXPAND :

Si vous n'êtes pas sur SQL Server Enterprise ou Developer Edition, vous devez utiliser l'indice WITH (NOEXPAND) pour le forcer à utiliser l'index, sinon il interrogera la base tblPurchase Au lieu. Et même dans ces éditions, il est préférable d'utiliser NOEXPAND .

Voir cet article par Paul White à ce sujet.