【问题标题】:Load SQL query result data into cache in advance提前将 SQL 查询结果数据加载到缓存中
【发布时间】:2011-02-11 13:35:33
【问题描述】:

我有以下情况:

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

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

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

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

你有什么别的想法吗?

【问题讨论】:

    标签: c# .net sql-server caching


    【解决方案1】:

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

    您是否尝试过对查询运行索引调整向导?如果是计划造成了问题,也许一些统计数据或额外的索引会帮助你,优化器很擅长推荐东西。

    【讨论】:

    • 你是对的 (+1),我已经纠正了我的问题。涉及的数据很多,速度慢肯定是因为它必须首先从磁盘加载。这不是计划,已经添加了附加索引。这真的是关于缓存。
    • +1 这更可能是数据缓存而不是查询计划创建。您可以在查询浏览器中对查询运行 EXPLAIN 以满足您自己的需要。在打开此表单时是否也打开了数据库连接(另一个潜在的减慢速度)?
    • @Marc:可以将查询放入存储过程中,然后异步启动 - 请参阅nayyeri.net/asynchronous-command-execution-in-net-2-0。这样,您可以在应用程序加载时启动 SP,让它从磁盘中提取所有内容并进入缓存,同时应用程序继续运行。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我已经测试过了,但它根本没有帮助。问题实际上是关于从磁盘缓存数据。设置 FMTONLY 不会实际运行查询,因此根本不会缓存任何数据。无论如何,谢谢你的想法。
    【解决方案3】:

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

    在这种情况下,您很可能会看到第一个请求的 Buffer Cache Hit Ratio 较低,而后续请求的数字较高。

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

    【讨论】:

      【解决方案4】:

      最后我还是使用了我最开始尝试的方法:从存储过程中执行查询并将结果放入临时表中,这样就不会返回任何内容。每当应用程序启动时,此“缓存”存储过程都会在后台执行。
      由于结果集是动态的,因此只需要一些时间来编写临时表。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多