我可以请求SQL Server缓存某个结果集吗?

时间:2010-11-04 10:33:04

标签: c# asp.net sql-server-2008 caching

从ASP .NET页面调用某个查询。我在Management Studio中研究了该查询的执行计划,87%用于排序。我非常需要排序,否则显示的数据将毫无意义。

无论如何,我是否可以请求SQL Server缓存已排序的结果集,以便在后续运行中更快地返回数据?

或者SQL Server是否足够智能来执行缓存处理,如果可能的话,我试图强制它缓存结果我做错了吗?

任何相关信息都将受到高度赞赏,并提前感谢:)

更新
我刚刚在一篇文章中读到,使用聚簇索引创建View会提高性能,因为索引会将视图中的数据保留到磁盘中。这是真的?我该如何做到这一点?有文章吗?

4 个答案:

答案 0 :(得分:12)

简而言之,不:不在SQL服务器端;它当然会在可能的情况下将数据加载到内存中,并缓存执行计划 - 因此后续调用可能更快,但它无法缓存结果。

选项:

  • 调整计划;排序听起来很激进 - 你可能会对某些数据进行非规范化或添加索引(甚至可能是聚集索引);如果你展示它,我们可以对查询做些其他的事情(但是没有完全工作的数据库的调优最好是猜测)
  • 如果明智的话,将结果缓存在网络服务器上

答案 1 :(得分:12)

虽然您可以创建indexed view,但正如您在更新中所提到的那样,您应该知道:

  1. 在创建视图和更新基于它的表时,必须遵循很多规则,
  2. 仅仅因为有一个(聚集的)索引,这并不意味着排序顺序 - 在查询此表时你仍然需要使用ORDER BY,并且,
  3. 除非您使用企业版,否则必须使用WITH(NOEXPAND)query hint
  4. 查询视图
  5. 您可以通过在CREATE INDEX语句中指定ASC和DESC来指定索引的顺序,而不是在CREATE VIEW中。在视图中允许ORDER BY的“黑客”(通过指定前100%)将无效。

答案 2 :(得分:2)

有时使用的选项是将已排序的数据存储在辅助表中。这可以是例如是一个临时表,只为会话创建,或者是整个数据库的缓存表。

答案 3 :(得分:1)

同样,SQL服务器本身会在内存中缓存频繁的查询。您可以使用查询分析器并运行复杂查询几次来测试这一点,每次都会变得更快。鉴于此,可能不需要永久缓存。

如果是,我建议使用缓存表并运行查询并将值插入另一个表中。您可以使用应用程序变量或其他sql表来确定何时再次刷新缓存。

用于插入缓存表的示例查询:

插入缓存选择值,表1中的值按字段排序