事先将SQL查询结果数据加载到缓存中

时间:2010-04-23 14:38:13

标签: c# .net sql-server caching

我有以下情况:

  • .net 3.5访问SQL Server 2008的WinForm客户端应用程序
  • 一些返回相对大量数据的查询经常被表单
  • 使用
  • 用户至少每天使用本地SQL Express并重新启动计算机
  • 其他用户通过慢速网络连接远程工作

问题是,重新启动后,用户第一次打开此表单时查询速度非常慢,并且在快速计算机上执行时需要花费大约15秒的时间。之后相同的查询只需3秒。当然,这是因为没有数据被缓存,必须先从磁盘加载。

我的问题:
是否可以提前将所需数据加载到SQL Server缓存中?

请注意
我的第一个想法是在应用程序启动时在后台工作程序中执行查询,这样当用户启动表单时,查询将已被缓存并直接执行。但是,我不希望将查询结果加载到客户端,因为某些用户正在远程工作或者网络速度较慢 所以我想只是从存储过程执行查询并将结果放入临时表中,以便不返回任何内容 事实证明,一些结果集使用动态列,因此我无法创建相应的临时表,因此这不是一个解决方案。

你碰巧有其他想法吗?

4 个答案:

答案 0 :(得分:3)

您确定这是正在创建的执行计划,还是正在进行的服务器内存缓存?也许第一个查询会加载相当多的数据,但后续查询可以使用已经缓存的数据,因此运行得更快。我从来没有看到执行计划花费超过一秒的时间来生成,所以我怀疑计划本身不是原因。

您是否尝试在查询中运行索引调整向导?如果是导致问题的计划,也许某些统计数据或其他索引可以帮助您,优化器非常擅长推荐。

答案 1 :(得分:1)

我不确定您是如何执行查询的,但您可以这样做:

SqlCommand Command = /* your command */
Command.ExecuteReader(CommandBehavior.SchemaOnly).Dispose();

使用仅架构命令行为执行命令会将SET FMTONLY ON添加到查询中,并使SQL Server获取有关结果集的元数据(需要生成计划),但will not actually execute the command。< / p>

答案 2 :(得分:0)

要缩小问题的根源,您始终可以使用perfmon中的SQL Server对象来大致了解SQL Server Express的本地实例的执行方式。

在这种情况下,您很可能会在第一个请求中看到较低的缓冲区高速缓存命中率,在后续请求中看到更高的数量。

此外,您可能需要查看http://msdn.microsoft.com/en-us/library/ms191129.aspx它描述了如何设置在SQL Server服务启动时自动运行的sproc。 如果您使用该sproc检索所需的数据,那么数据将保持缓存并在最终用户通过表单首次检索数据时提高性能。

答案 3 :(得分:0)

最后,我仍然使用我首先尝试的方法:从存储过程执行查询并将结果放入临时表中,以便不返回任何内容。每当应用程序启动时,此“缓存”存储过程将在后台执行 编写临时表只需要一些时间,因为结果集是动态的。

感谢大家对这个问题的快速帮助!