2009-02-28 72 views
1

我有一个已经在我的2人身上工作过的SP,仍然需要2分钟或更长时间才能运行。有没有办法让这些预运行和存储在缓存或其他地方,所以当我的客户需要在Web浏览器中查看这些数据时,他不想让自己或我自己挂上?保存/缓存存储过程结果以获得更好的性能? (SQL Server 2005)

我不是在靠近DBA的地方,所以我受到我雇用的人的摆布,以便为我解决这个问题,所以在前面有一点知识会帮助我。

+0

此查询的结果是否在线显示,即在浏览器中显示。如果是的话,你目前使用或正在使用哪种语言? – 2009-02-28 14:46:13

+0

是的,它显示在网上 - 我使用.Net。我知道我可以在我的应用程序中缓存结果,但最初的调用需要几分钟的时间是一个真正的问题。 – Slee 2009-02-28 17:03:02

回答

8

如果确实需要很长时间才能运行,您可以安排使用SQL Agent运行进程,并将输出转到表中,然后更改Web应用程序以读取表而不是执行存储过程。您必须决定刷新的频率,并处理刷新时发生的请求,但也可以通过生成两个输出文件(一个用于最新刷新)和一个输出文件来处理。

但我会再看一下这个过程,看一下执行计划,看看它在哪里很慢,确保它没有进行全表扫描。

1

从“查询”菜单尝试“分析数据库引擎优化顾问中的查询”。 我通常将过程编写到一个新窗口中,取出查询定义部分并尝试临时表,常规表和表变量的不同组合。

0

您可以将结果集缓存在应用程序中而不是数据库中,或者在内存中保存数据表的实例,或者将其序列化到磁盘。它返回多少行? 在这里发布代码太长了吗?顺序

4

首选的解决方案:

  1. 分析查询,并相应地优化
  2. 缓存在应用程序中(可以使用httpRuntime.Cache(即使不是asp.net应用程序)
  3. 缓存SPROC导致数据库中的表格,然后添加触发器以使缓存失效(删除表格),因此,对SPROC的调用将首先查看缓存表中是否有任何数据,如果没有,请运行SPROC并存储导致缓存表中,如果是这样,返回该表中的数据SPROC的“源”表上的触发器将会出现从CacheTable中删除*到“清除缓存”(取决于你所做的sproc和它的依赖关系,你甚至可以根据触发器部分更新缓存表,但所有这些很快就难以维护。但有时你必须做你必须做的事......这种方法将允许缓存表根据需要进行更新。您将始终拥有最新的数据,并且SPROC只会在需要时运行。
0

OK首先第一件事情,索引:

  • 你对表有什么指标,是利用他们的执行计划?
  • 你有所有外键字段的索引吗?

其次,它的PROC使用下列性能杀手:

  • 光标
  • 子查询
  • 一个用户定义的函数
  • SELECT *
  • 搜索以通配符开头的标准

第三个

  • 可以将where子句重写为sargeable?有几种方法可以写出几乎所有的东西,有些方法比其他方法更好。

我建议你去购买你的开发者关于性能调优的书籍。

可能你的过程可能是固定的,但是如果没有看到代码,很难猜出问题可能是什么。