SQL Server - 长时间运行的聚合查询策略

时间:2014-01-06 14:35:55

标签: c# asp.net sql-server performance caching

方案:

  • ASP.Net 4.5 Web应用程序,用于捕获用户对视频的“投票”。
  • 每次投票后,SQL Server 2012存储过程计算视频的投票余额。

问题:

  • 少数选票表现良好。
  • 当投票数达到100,000以上时,查询可能需要10秒以上才能完成(无法接受的等待时间)。

的问题:

  1. SQL Server作业是否每15-30分钟运行一次?
  2. 可以将SUM结果“缓存”在表格列中以供Web应用使用吗?
  3. 当网络应用访问相同的值时,任务更新的任何问题都缓存了SUM?

2 个答案:

答案 0 :(得分:1)

更新100k行的SUM需要10秒意味着你有一个糟糕的表设计。你错过了一个或多个索引。更新100k行的总和应该花费10ms或更少。

除此之外,SQL Server可以为您维护SUM。只需在所需表达式上创建索引视图即可。见Create Indexed ViewsSUM是索引视图中受支持的聚合。

这是SqlFiddle

索引视图优于自制解决方案(例如,在触发器中维护的列),因为首先,正确且更简单(代码更少),由引擎维护< em>任何情况并且不会漂移(例如,如果暂时禁用触发器)。这甚至没有考虑任何基于触发器的解决方案中固有的所有缺点。

答案 1 :(得分:0)

您的问题的答案:

  1. 我会说不。在这个大小的表上的总和应该不是问题,你可能在其他地方有问题。一旦超过一百万行,您可能需要考虑将其作为一个选项,但您还需要做一些其他事情以确保数据不会太快过时。
  2. 执行计划可能是,但结果不会。
  3. 是的,但你不应该注意到它。当您执行完整的表SELECT时,您将锁定表以便聚合函数可以运行,但这只会阻止写入。如果你要花一个年龄写一行而且聚合函数无法锁定表,你可能会遇到问题,但我无法想象这种类型的应用程序会如何引起明显的锁定。
  4. 您是否尝试过编制此列的索引,以便服务器生成列统计信息? SUM值(在我看来)可能是一个统计数据,所以这可能会加快速度。