2015-05-14 43 views
2

對於我們的應用程序之一,我們在多個表中有大量數據,並且每次用戶都做了一些新記錄插入到這些表中。有一個報告屏幕,我們必須從這些表格中進行計算,並顯示這些表格中的總計SQL Server:實時更新報告表

例如:假設有兩個父表員工和考勤 員工表具有100,000條記錄,而考勤表具有每天每天的數據一名員工離開他們的建築。出勤表中的記錄每年更多200萬。我需要計算每位員工的出勤率(總計)並在屏幕上顯示所有100,000條記錄,並根據員工姓名進行分頁。計算需要很多時間,並且會激增DB CPU。

爲了避免總林規劃運行時間計算具有與每個僱員總計算值一個單獨的表,只是查詢表,並顯示它在需要時。但問題在於,前幾年數據不會改變,但是在當年每當員工每天記錄出勤率時就會生成數據。對於每位員工,每當本年度的新出勤記錄時,實時更新表格的最佳選擇是什麼?

我想用觸發器觸發,但都是同步的,當過我查詢它應該不會影響我的報告應用程序的性能,否則會影響刀片的性能到父表。

請讓我知道,如果有任何更好的方法來實時更新我的​​總價值表,而不會影響插入或更新到父表

回答

0

這是一個索引視圖完美的情況下的性能。當然,你查詢的核心是一組如下:

select EmployeeID, count(*) 
from AttendanceRecords 
group by EmployeeID 

索引該視圖。它的內容將便宜並實時更新。不同步數據的可能性爲零。

+0

這可能是一個很好的解決方案,但要確保它不會影響插入性能。我已經看到索引視圖真的把插入,複製等東西拖下去...... –

+0

@snow_FFFFFF是的。他需要查看查詢計劃。正確完成它實際上就像另一個索引。沒有那麼貴。引擎的增量更新邏輯非常複雜。 – usr

0

一種選擇是使用SQL更改跟蹤: https://msdn.microsoft.com/en-us/bb933875.aspx

這是不會改變的數據採集(這是相當沉重) - 更改跟蹤只是讓你知道哪些鍵改變這樣你就可以採取行動。有了這些信息,您就可以有一份收集這些更改並更新您的摘要的常規工作。

...或者,如果你可以使用SQL 2014年,你可以進入可更新列存儲,並與總結免除。

0

你可以考慮出口從往年的數據,並用它在早些年爲員工創造的總人次計數?

你說你正朝着本質上有一個表充當計數器的方向發展,所以通過確保你的舊數據符合這個模型,編寫和維護與之交互的代碼將會容易得多它和來自任何單個查詢的服務器負載應該是最小的。