Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да запазя таблицата tblPurchase и tblProductStock без спад. (Трябва да запазя таблицата и стойността постоянни без спад)

Индексиран изглед

Изцяло ново решение, базирано на Индексирани изгледи е възможно.

Индексираният изглед е изглед, който има групиран индекс върху него и данните всъщност се съхраняват на диск.

Доколкото разбирам, вие се опитвате да запазите сума от покупки на продуктов артикул, съхранявана в tblProduct . Предположих, че ItemCode е PK на tblProduct и този ItemName също е дефиниран там (Не можем да използваме MAX в индексиран изглед). Така че можем да дефинираме изглед като този:

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

След това можем да създадем клъстерен индекс върху него, за да го запазим на диска. SQL Server ще поддържа индекса винаги, когато се случи актуализация на базовата таблица. Ако няма повече редове в групирането (идентифицира се чрез броя, който е 0), тогава редът се изтрива:

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

Сега, ако искаме да го направим запитване, можем да се присъединим към този изглед наляво към tblProducts (ляво присъединяване, защото може да няма покупки):

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;

Можем да дефинираме това и като изглед (не индексиран, а стандартен изглед), така че дефиницията да може да се използва навсякъде.

Забележка относно NOEXPAND :

Ако не използвате SQL Server Enterprise или Developer Edition, трябва да използвате подсказката WITH (NOEXPAND) за да го принуди да използва индекса, в противен случай ще направи заявка към базата tblPurchase вместо. И дори в тези издания е най-добре да използвате NOEXPAND .

Вижте тази статия от Пол Уайт за това.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server c# връзка

  2. 3 начина да получите схемата на набор от резултати в SQL Server

  3. Какво ще се случи, когато клеймото за време (версия на ред) се препълни?

  4. Настройка на SQL Server Reporting Services

  5. Каква е сравнителната скорост на временните таблици спрямо физическите таблици в SQL?