[英]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
表的一種非常老套的方法。 任何有關如何改進此更新語句的幫助,以便我不必在每次插入新用戶或一批用戶時完全覆蓋表,將不勝感激。
首先,您的觸發器存在嚴重缺陷:它不使用inserted
或deleted
的表,而是每次都重新計算整個事物,這對性能非常不利。 它也沒有指定它是用於插入、更新還是刪除。
一個更好的解決方案是使用索引視圖。 這就像一個常規視圖,除了服務器在磁盤上維護實際數據,並在底層表發生更改時實時更新它。
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);
索引視圖有一些限制,其中:
INNER
或CROSS
,沒有LEFT/RIGHT/FULL/APPLY
或派生表、CTE 或子查詢。GROUP BY
,則必須添加COUNT_BIG
,並且唯一允許的其他聚合是SUM
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.