【问题标题】:SQL Server : Update reporting table in real timeSQL Server:实时更新报表
【发布时间】:2015-05-14 20:52:56
【问题描述】:

对于我们的一个应用程序,我们在多个表中有大量数据,每次用户执行某项操作时,都会将新记录插入这些表中。有一个报告屏幕,我们必须从这些表格中进行计算并显示这些表格的总数

例如:假设有两个父表Employee和Attendance 员工表有 100,000 条记录,而出勤表有每天员工进出大楼时的数据。出勤表中的记录为一年多 200 万。我需要计算每个员工的出勤率(总计)并将其显示在屏幕上以显示所有 100,000 条记录,并根据员工姓名进行分页。计算需要太多时间,并且会导致数据库 CPU 峰值。

为了避免运行时计算总数,我计划有一个单独的表,其中包含每个员工的总计算值,只需查询该表并在需要时显示它。但问题是前几年的数据不会改变,但对于本年度,只要员工每天记录出勤,就会生成数据。每当记录本年度的新出勤率时,对于我来说,让每个员工的 Total 实时更新表格的最佳选择是什么。

我曾想过使用触发器,但触发器是同步的,当我查询时它会影响我的报告应用程序的性能,否则会影响插入父表的性能。

如果有更好的方法来实时更新我的​​总值表而不影响插入或更新父表的性能,请告诉我

【问题讨论】:

    标签: sql sql-server database sql-server-2008


    【解决方案1】:

    这是索引视图的完美案例。当然,您查询的核心是 group by,例如:

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

    索引该视图。然后,它的内容将以便宜的价格提供并实时更新。数据不同步的可能性为零。

    【讨论】:

    • 这可能是一个很好的解决方案,但请确保它不会影响您的插入性能。我已经看到索引视图确实通过插入、复制等拖累了事情......
    • @snow_FFFFFF 是的。他需要查看查询计划。做得好它真的就像另一个索引。没有比这贵很多。引擎的增量更新逻辑很复杂。
    【解决方案2】:

    一种选择是使用 SQL 更改跟踪: https://msdn.microsoft.com/en-us/bb933875.aspx

    这不是变更数据捕获(可能非常繁重)- 变更跟踪只是让您知道哪些键发生了变化,以便您可以采取行动。有了这些信息,您就可以有一份定期的工作来收集这些更改并更新您的摘要。

    ...或者,如果您可以使用 SQL 2014,您可以进入可更新列存储并省去摘要。

    【讨论】:

      【解决方案3】:

      您是否考虑导出前几年的数据并使用它来创建前几年员工的总出勤人数?

      您说您现在基本上将表用作计数器,因此通过确保您的旧数据也符合此模型,编写和维护与之交互的代码会容易得多并且任何单个查询的服务器负载都应该是最小的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 2011-08-07
        • 1970-01-01
        • 2012-05-10
        • 2021-03-06
        相关资源
        最近更新 更多