对于我们的一个应用程序,我们在多个表中都有大量数据,每次用户执行某些操作时,新记录都会插入到这些表中。有一个报告屏幕,我们必须从这些表中进行计算并显示这些表中的总数
例如:假设两个父表Employee和Attendance 员工表有100,000条记录,每当员工离开他们的建筑物时,出勤表都有每天的数据。出勤表中的记录一年超过200万。我需要计算每个员工的出勤率(总计)并在屏幕上显示所有100,000条记录,并根据员工姓名进行分页。计算过程需要花费太多时间并且它会激活DB CPU。
为了避免运行时计算总计划计划为每个员工创建一个包含总计算值的单独表格,只需查询表格并在需要时显示。但问题是前几年的数据不会改变,但是当今员工每天记录出勤时,数据都会产生。当我们记录当年的新出勤率时,对于每个员工来说,实时更新表格的最佳选择是什么。
我想过使用触发器,但是触发器是同步的,它会在我查询时影响我的报告应用程序的性能,否则会影响父表中插入的性能。
如果有更好的方法可以实时更新我的总价值表而不影响插入或更新父表的性能,请告诉我
答案 0 :(得分:0)
这是索引视图的完美案例。当然,查询的核心是一个组,例如:
select EmployeeID, count(*)
from AttendanceRecords
group by EmployeeID
索引该视图。然后便宜地提供它的内容并实时更新。不同步数据的可能性为零。
答案 1 :(得分:0)
一种选择是使用SQL更改跟踪: https://msdn.microsoft.com/en-us/bb933875.aspx
这不是更改数据捕获(可能非常繁重) - 更改跟踪只是让您知道哪些键已更改,因此您可以对其进行操作。有了这些信息,您就可以找到一份定期工作来收集这些更改并更新摘要。
...或者,如果您可以使用SQL 2014,您可以进入可更新列存储并免除摘要。
答案 2 :(得分:0)
您是否会考虑导出前几年的数据并使用它来创建前几年员工的总出勤率?
你说你现在正朝着基本上有一个表作为计数器的方向前进,所以通过确保你的旧数据符合这个模型,它将更容易编写和维护代码与它交互并且来自任何单个查询的服务器负载应该是最小的。