代码之家  ›  专栏  ›  技术社区  ›  Ranhiru Jude Cooray

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

  •  11
  • Ranhiru Jude Cooray  · 技术社区  · 15 年前

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

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

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

    如有任何相关信息,我们将不胜感激,并提前感谢:)

    更新:
    我刚刚在一篇文章中读到,使用聚集索引创建视图将提高性能,因为索引将把视图中的数据持久保存到磁盘上。这是真的吗?我该怎么做?有文章吗?

    4 回复  |  直到 12 年前
        1
  •  12
  •   Marc Gravell    15 年前

    简而言之,否:不在SQL Server端;如果可能,它当然会将数据加载到内存中,并缓存 执行计划 -所以随后的电话可能是 更快 但是它不能缓存结果。

    选项:

    • 调整计划;排序听起来很有侵略性—您可以取消某些数据的规范化,或者添加索引(甚至是聚集索引);如果您显示查询,我们还可以对其执行其他操作(但最好是在没有完全工作的DB的情况下进行调整)。
    • 缓存结果 在Web服务器上 如果这样做是明智的
        2
  •  12
  •   Damien_The_Unbeliever    13 年前

    当你 可以 创建 indexed view ,正如您在更新中提到的,您应该注意:

    1. 无论是在创建视图时还是在更新视图所基于的表时,都需要遵循很多规则,并且,
    2. 只是因为有一个(聚集的)索引,这并不意味着排序顺序-在查询该表时,您仍然需要使用ORDER BY,并且,
    3. 除非您使用的是企业版,否则必须使用查询视图(noexpand) query hint
    4. 您可以通过在create index语句中而不是在create视图中指定asc和desc来指定索引的顺序。允许在视图中按顺序排序的“黑客”(通过指定前100%)将没有效果。
        3
  •  2
  •   Pieter van Ginkel    15 年前

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

        4
  •  1
  •   Brian Smith    15 年前

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

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

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

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

    推荐文章