2017-09-24 97 views
0

我有一个运行存储过程的网站,当您打开主页时。该存储过程处理来自4个关系表的数据并给出结果。由于数据库记录增加,存储过程的完成可能需要超过10秒,而且对于主页来说太多了。将耗时的存储过程的结果插入到表中

因此,我认为,将存储过程的结果定期插入到新表中并使用该表作为主页可能是一个很好的主意来解决问题,但我不确定这是否是SQL Server的良好实践。

有没有我的情况下,任何更好的解决方案?

编辑:这4代表每15分钟约30插入更新。

+0

一种方法是用日期/时间查询已运行沿着缓存结果的表中的一个副本。当用户请求数据时,存储过程会检查缓存的年龄。如果可以接受,那就是用户得到的,否则用户必须等待缓存重建。另一种方法是以适当的时间间隔重新构建缓存的计划任务。如果正确完成,新查询运行时总会有可用数据的副本(有点陈旧),这样就没有人需要等待结果。 – HABO

回答

0

如果你愿意有一个“指定的受害者”根据需要进行更新缓存(这也可能导致其他用户等待),你可以做这样的事情在一个存储过程(SP):

  1. 启动一个事务来阻止对缓存的访问。
  2. 检查缓存条目的日期/时间。 (这要求增加一个CacheUpdated列高速缓存表或其它地方存储的值。)
  3. 如果缓存的数据是足够新然后返回的数据,并结束事务。
  4. 删除缓存的数据和运行新的查询与适当的CacheUpdated日期/时间来填充它。
  5. 返回缓存的数据并结束事务。

如果更新时间太长了用户等待,或缓存重建块太多的用户,您可以通过在SQL Server代理创建工作运行在预定的时间间隔的存储过程。 SP将:

  1. 保存当前的日期/时间,例如,作为@Now
  2. 运行查询以更新标记每行的缓存CacheUpdated = @Now
  3. 删除任何缓存行,其中CacheUpdate != @Now

用户的相应SP将简单地返回最早的一组数据,即Min(CacheUpdated)行。如果只有一组,那就是他们得到的。如果更新正在进行,则他们将获得较旧的完整集合,而不是正在进行的工作。我用

0

至于你解释你的问题,我看到这样做没有问题,但你必须更多地解释,因为我们不知道你收集的数据的类型以及它是如何提高每一次,以便提供你一个更好的解决方案

+0

我向问题添加了更新频率信息。 – Yavuz

+0

是否可以通过在SQL Server代理中创建作业按计划的时间间隔运行存储过程,我发现在使用某些主机时并不是所有人都可以使用SQL Server代理。有没有链接到您的网站,所以我可以告诉你我最好的方法。因为可以用其他方式杀死同一只猫,有时它只是将设计改变成一个小小的登陆页面。不是存储过程。 –

相关问题