【问题标题】:How to cache a query which is often used? [closed]如何缓存一个经常使用的查询? [关闭]
【发布时间】:2012-10-11 15:36:17
【问题描述】:

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

【问题讨论】:

    标签: sql-server performance jakarta-ee content-management-system


    【解决方案1】:

    我可以提出以下建议:

    1. 在您的数据库中,您可以使用 idex 视图,请查看:How to mimick Oracle Materialized Views on MS SQL Server?
    2. 如果您使用过 JPA 或 Hibernate,它可以缓存实体(对象)。
    3. 如果您正在寻找与数据库和 ORM 无关的缓存系统,也许您可​​以查看 MemCache 或 EHCache。
    4. 一个选项但不推荐在应用程序中管理缓存,例如您可以在 ServletContext(也称为 ApplicationContext)中存储国家列表,但您需要实现缓存的业务逻辑(更新、删除和插入对象),你也需要小心堆内存。

    您可以结合使用上述策略,具体取决于您的业务环境

    最好的问候,

    埃内斯托。

    【讨论】:

    • + 将对物化视图的查询包装到存储过程中,并在使用 JDBC 时使用 CallableStatement 和语句缓存。
    • @bobah 为什么程序可以提高性能?
    • @newand - 查询将在服务器上不断预编译
    【解决方案2】:

    这是一个非常笼统的问题,正如您所料,有很多选择。

    最接近用户界面,您的网络平台可能有“内容缓存”。例如,ASP.NET 会在指定的时间段内缓存页面的某些部分。

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

    一些 ORM 也提供缓存。

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

    只是一些想法。

    【讨论】:

    • 感谢重播,SQL Server的使用有什么建议吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 2021-10-04
      • 2023-03-08
      • 2017-04-29
      • 2016-02-06
      • 2012-01-25
      • 2013-04-18
      • 1970-01-01
      • 2017-10-05
      相关资源
      最近更新 更多