【发布时间】:2012-10-11 15:36:17
【问题描述】:
当网页应用会频繁查询某些信息时,如何通过缓存查询结果来提高性能? (信息就像网站上的头条新闻,我的数据库是 SQL Server 2008,应用程序在 tomcat 上。)
【问题讨论】:
标签: sql-server performance jakarta-ee content-management-system
当网页应用会频繁查询某些信息时,如何通过缓存查询结果来提高性能? (信息就像网站上的头条新闻,我的数据库是 SQL Server 2008,应用程序在 tomcat 上。)
【问题讨论】:
标签: sql-server performance jakarta-ee content-management-system
我可以提出以下建议:
您可以结合使用上述策略,具体取决于您的业务环境
最好的问候,
埃内斯托。
【讨论】:
这是一个非常笼统的问题,正如您所料,有很多选择。
最接近用户界面,您的网络平台可能有“内容缓存”。例如,ASP.NET 会在指定的时间段内缓存页面的某些部分。
您可以使用像 memcached 这样的缓存工具并缓存一个记录集(或任何独立的 Java 数据结构)。
一些 ORM 也提供缓存。
而且(可能不是最终)您可以在数据库中定义结构来“缓存”这样的结果,方法是运行复杂的查询并将结果保存到查询频率更高但查询成本更低的表中。
只是一些想法。
【讨论】:
对于一个非常大的网站,答案就是以上所有。我们通过存储过程进行所有查询。这很有帮助,因为查询被编译并且一个执行计划被重用。我们有一个邪恶的复杂表值函数。太贵了,我们建了一个缓存表。该表具有与函数相同的一般格式,但有两个附加功能。一是过期时间。另一个是搜索键。搜索键是连接在一起的函数中的参数。每当我们要查询该表时,我们都会运行一个 Proc 来检查数据是否过时。如果是我们启动事务删除行,然后运行函数并插入行。这意味着我们运行该函数的次数可能是过去的 2% 或 3%,而且我们为检查陈旧性而进行的 proc 调用要便宜得多。每当应用程序更新相关数据时,它都会将缓存行更新为陈旧的 - 但它不会删除它们,我们将其留给缓存检查功能。为什么?好吧,也许现在没有人需要这些数据,所以更少的数据库命中。然后我们到达第二层。我们在 memcached 中缓存了许多记录集。包括调用该函数的所有 proc,等等。这实际上发生在我们仍然拥有的 asp 层中。 ADO 记录集可以本地持久化到 xml,然后作为字符串进入 memcache。
【讨论】: