2015-05-14 44 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

你可以考虑出口从往年的数据,并用它在早些年为员工创造的总人次计数?

你说你正朝着本质上有一个表充当计数器的方向发展,所以通过确保你的旧数据符合这个模型,编写和维护与之交互的代码将会容易得多它和来自任何单个查询的服务器负载应该是最小的。