下面是问题。

在我最近接管了它的网站跟踪“英里”你在一天跑了。这样用户就可以登录到该网站,补充说,他们跑了5英里。这然后被添加到数据库中。

在一天结束时,上午01时左右,从而计算所有英里的服务运行中,所有的用户运行在当天,并且输出文本文件的App_Data。然后,该文本文件显示在闪光灯的主页上。

我觉得这是很荒谬。有人告诉我,他们不得不这样做是由于巨大的性能问题。他们不会告诉我,他们究竟是如何做之前它还是什么重大的性能问题了。

所以将你们采取什么办法?这突然出现在我的脑海里的第一件事是一个Web服务,它通过一个AJAX调用获取的数据。也许每次添加一个新的“一英里”进入时间,一个触发器被触发,并更新“GlobalMiles”表。

我理解在此的任何信息或提示。

太感谢了!

有帮助吗?

解决方案

要回答这个问题有点难度,因为有我们不知道你的所有要求,一些以前没有工作。因此,这里有一些不同的看法。

首先,重新审视你的假设。生成静态报表,每日一次是一个完全有效的解决方案,如果你需要的是每日报告。为什么数据库多次throghout白天打,如果这是需要的所有是一个快照(例如,当一个博客张贴大量用来编写HTML文件博客软件,而不是每次都服务了从数据库中录入 - 许多人仍然做作为优化)。是“实时”功能的东西你加入?

我也不会跳AJAX的时候了。使用相同的输入法,只需将报告从静态到动态。做得太多一下子就是让自己埋没的好办法。当改变现有的代码中,我试图找到我可以在隔离王氏影响最少的改变应用程序的休息区。然后,一旦你拥有动态报表,那么你可以添加AJAX(和请使用进步增强)。

至于动力报告本身,你有几种选择。

当然,你可以只是SELECT SUM(),但它听起来像,将导致性能问题,如果每个用户有大量的条目。

如果你的数据库支持的话,我想看看使用索引视图(有时称为物化视图)。它应该支持允许快速更新,实时和数据:

CREATE VIEW vw_Miles WITH SCHEMABINDING AS 
SELECT SUM([Count]) AS TotalMiles, 
COUNT_BIG(*) AS [EntryCount],
UserId
FROM Miles
GROUP BY UserID
GO
CREATE UNIQUE CLUSTERED INDEX ix_Miles ON vw_Miles(UserId)

如果那开销太大,@ jn29098的解决方案是一次不错的。把它卷起来使用计划任务。如果有很多针对每个用户的条目,你只能从最后一次任务运行添加的增量。

UPDATE GlobalMiles SET [TotalMiles] = [TotalMiles] + 
  (SELECT SUM([Count]) 
    FROM Miles 
    WHERE UserId = @id 
      AND EntryDate > @lastTaskRun
    GROUP BY UserId)
WHERE UserId = @id

如果你不关心存储的各个条目,但只有总,你可以随时更新计数:

UPDATE Miles SET [Count] = [Count] + @newCount WHERE UserId = @id

您可以与其将所述条目中的SPROC一起使用此方法,并有两个世界。

最后,你的触发方式将正常工作。这是索引视图,你自己做了更新的SQL自动做一个表instad的替代品。这也是相似的地方您移动全球更新了存储过程,并成为一个触发前面的选项。

在过去的三个选项,使其更难以处理时的条目被移除的情况,但如果这不是你的应用程序的功能,那么您可能不需要担心。

现在,你已经得到了实现,在数据库中的实时数据,现在你可以动态生成报告。然后,你可以使用AJAX添加花哨。

其他提示

如果他们忠实地为由于在数据库上许多命中性能问题,那么我建议你把所有的输入,并将其塞进一个消息队列(MSMQ)。然后你就可以有拾取消息并执行数据的批量插入另一端的服务。这样,您有较少的DB命中。然后,你可以输出到上的更新文本文件了。

我想创建真实卷起,其计算总英里运行一次/小时或夜间的汇总表。对于单个的请求,你可以拉从夜间汇总表以及任何另外的记录英里最后汇总计算当用户查看网页,以获得总该用户之间的周期。

多少用户你说的是多少日志,每天记录?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top