簡體   English   中英

SQL 服務器:根據另一個表的更改自動更新到匯總表的最佳方式

[英]SQL Server: Best way to automatically stream updates to a summary table based on changes from another table

我目前在 SQL 服務器數據庫中工作,其中我有一個表User ,其架構如下:

用戶名 類別
用戶1 賭博
用戶2 賭博
用戶3 運動的

我的匯總表UserCategoryCount是一個簡單的groupby語句,用於說明每個類別有多少用戶,如下所示:

類別 用戶數
賭博 2
運動的 1

新條目不斷被上傳到User ,我希望能夠將User表中的 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 更新到UserCategoryCount匯總表。 我知道我可以創建一個簡單的 VIEW 語句,在User表上執行groupby ,但我希望UserCategoryCount成為它自己的表,它會根據上傳到User表的新用戶自動更改。

我的第一個想法是創建一個觸發器來檢測User表何時更新。 到目前為止,我能想到的最簡單但俗氣的解決方案是創建一個觸發器,該觸發器只是刪除和刷新UserCategoryCount

CREATE TRIGGER TRG_Add_User
ON User
AS
BEGIN
DELETE FROM UserCategoryCount
INSERT INTO UserCategoryCount (category, numUsers)
SELECT Category, Count(Category) as numUsers
FROM User GROUP BY Category
END
GO

但這似乎是更新UserCategoryCount表的一種非常老套的方法。 任何有關如何改進此更新語句的幫助,以便我不必在每次插入新用戶或一批用戶時完全覆蓋表,將不勝感激。

首先,您的觸發器存在嚴重缺陷:它不使用inserteddeleted的表,而是每次都重新計算整個事物,這對性能非常不利。 它也沒有指定它是用於插入、更新還是刪除。

一個更好的解決方案是使用索引視圖。 這就像一個常規視圖,除了服務器在磁盤上維護實際數據,並在底層表發生更改時實時更新它。

CREATE OR ALTER VIEW dbo.UserCategoryCount
WITH SCHEMABINDING
AS
SELECT
    u.Category,
    COUNT_BIG(*) AS numUsers
FROM dbo.User u
GROUP BY u.Category;

GO

CREATE UNIQUE CLUSTERED INDEX CX_UserCategoryCount ON dbo.UserCategoryCount (Category);

索引視圖有一些限制,其中:

  • 它們必須是模式綁定的,因此不能更改基礎列
  • 所有表必須是兩部分的,模式和表
  • 只允許連接是INNERCROSS ,沒有LEFT/RIGHT/FULL/APPLY或派生表、CTE 或子查詢。
  • 如果有GROUP BY ,則必須添加COUNT_BIG ,並且唯一允許的其他聚合是SUM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM