Sql server 如何缓存经常使用的查询?

Sql server 如何缓存经常使用的查询?,sql-server,performance,jakarta-ee,content-management-system,Sql Server,Performance,Jakarta Ee,Content Management System,当web应用经常查询某些信息时,如何通过缓存查询结果来提高性能? (这些信息就像网站上的头条新闻,我的数据库是SQL Server 2008,应用程序在tomcat上。)这是一个相当普遍的问题,正如您所说,有很多选择 最靠近UI的web平台可能具有“内容缓存”。例如,ASP.NET将在指定的时间段内缓存页面的部分内容 您可以使用像memcached这样的缓存工具来缓存记录集(或任何独立的Java数据结构) 一些ORM也提供缓存 而且(可能不是最后),您可以通过运行复杂的查询并将结果保存到查询频率

当web应用经常查询某些信息时,如何通过缓存查询结果来提高性能?
(这些信息就像网站上的头条新闻,我的数据库是SQL Server 2008,应用程序在tomcat上。)

这是一个相当普遍的问题,正如您所说,有很多选择

最靠近UI的web平台可能具有“内容缓存”。例如,ASP.NET将在指定的时间段内缓存页面的部分内容

您可以使用像memcached这样的缓存工具来缓存记录集(或任何独立的Java数据结构)

一些ORM也提供缓存

而且(可能不是最后),您可以通过运行复杂的查询并将结果保存到查询频率更高但查询成本更低的表中,在数据库中定义这样的“缓存”结果的结构


只是一些想法。

这是一个相当普遍的问题,如您所述,有很多选择

最靠近UI的web平台可能具有“内容缓存”。例如,ASP.NET将在指定的时间段内缓存页面的部分内容

您可以使用像memcached这样的缓存工具来缓存记录集(或任何独立的Java数据结构)

一些ORM也提供缓存

而且(可能不是最后),您可以通过运行复杂的查询并将结果保存到查询频率更高但查询成本更低的表中,在数据库中定义这样的“缓存”结果的结构


只是一些想法。

我可以提出以下建议:

  • 在数据库中,您可以使用idex视图,请检查:
  • 如果您使用过JPA或Hibernate,它可以缓存实体(对象)。
  • 如果您正在寻找一个数据库和ORM之外的缓存系统,也许您可以查看MemCache或EHCache。
  • 一个不推荐的选项是管理应用程序中的缓存,例如,您可以在ServletContext(也称为ApplicationContext)中存储国家/地区列表,但您需要实现缓存的业务逻辑(更新、删除和插入对象),还需要小心堆内存
  • 您可以结合使用上述策略,具体取决于您的业务环境

    致以最良好的祝愿


    Ernesto.

    我可以提出以下建议:

  • 在数据库中,您可以使用idex视图,请检查:
  • 如果您使用过JPA或Hibernate,它可以缓存实体(对象)。
  • 如果您正在寻找一个数据库和ORM之外的缓存系统,也许您可以查看MemCache或EHCache。
  • 一个不推荐的选项是管理应用程序中的缓存,例如,您可以在ServletContext(也称为ApplicationContext)中存储国家/地区列表,但您需要实现缓存的业务逻辑(更新、删除和插入对象),还需要小心堆内存
  • 您可以结合使用上述策略,具体取决于您的业务环境

    致以最良好的祝愿


    Ernesto.

    对于一个真正大的网站来说,答案就是以上所有内容。我们通过存储过程进行所有查询。这很有帮助,因为查询是编译的,并且重用了一个执行计划。我们有一个非常复杂的表值函数。它太贵了,我们建了一个缓存表。该表与函数具有相同的通用格式,但有两个附加值。一个是过期时间。另一个是搜索键。搜索键是连接到函数中的参数。每当我们要查询该表时,我们都会运行一个Proc来检查数据是否过时。如果是,则启动事务删除行,然后运行函数并插入行。这意味着我们运行该函数的时间可能是以前的2%或3%,而我们用来检查陈旧性的proc调用要便宜得多。每当应用程序更新相关数据时,它都会将缓存行更新为陈旧数据,但不会删除它们,我们将其留给缓存检查功能。为什么?也许现在没人会需要这些数据,所以数据库命中率会降低。然后我们到达第二层。我们在memcached中缓存了许多记录集。包括所有调用该函数的进程,以及更多。这实际上发生在我们的asp层中,我们仍然拥有它。ADO记录集可以本机持久化为xml,然后作为字符串进入memcache。

    对于一个真正大的站点,答案就是以上所有内容。我们通过存储过程进行所有查询。这很有帮助,因为查询是编译的,并且重用了一个执行计划。我们有一个非常复杂的表值函数。它太贵了,我们建了一个缓存表。该表与函数具有相同的通用格式,但有两个附加值。一个是过期时间。另一个是搜索键。搜索键是连接到函数中的参数。每当我们要查询该表时,我们都会运行一个Proc来检查数据是否过时。如果是,则启动事务删除行,然后运行函数并插入行。这意味着我们运行该函数的时间可能是以前的2%或3%,而我们用来检查陈旧性的proc调用要便宜得多。每当应用程序更新相关数据时,它都会将缓存行更新为陈旧数据,但不会删除它们,我们将其留给缓存检查功能。为什么?也许现在没人会需要这些数据,所以数据库命中率会降低。然后我们到达第二层。我们在memcached中缓存了许多记录集。包括所有调用该函数的进程,以及更多。这实际上发生在我们的asp层中,我们仍然拥有它。ADO记录集可以本机持久化为xml,然后作为字符串进入memcache。

    感谢您的重播,是否有关于使用SQL Server的建议?谢谢