是否可以在数据库中缓存选择查询的结果集



我正在尝试优化我们系统中最常用的搜索查询。到目前为止,我已经添加了一些缺失的索引,这有一点帮助。但是我想进一步减少数据库服务器上的负载。我将使用的一个选项是将结果集缓存为asp.net缓存中的LIST,这样我就不必经常访问数据库。

然而,我想知道是否有一种方法可以在数据库中缓存选择查询的某些部分。例如,对于搜索结果,我们只考虑在过去180天内活跃的用户,并且将share-info设置为true。因此,这就像db每次处理的超集,然后应用其他条件,如指定的类别,城市等。是否有可能以某种方式缓存超级集,以便我可以对超级集运行查询,而不是对整个表运行查询?创建一个视图会有帮助吗?我有点犹豫是否要创建一个视图,因为我读到管理视图可能是一个开销,并带走了一些修改表的灵活性。

我正在使用Sql-Server 2005,所以不能在表上创建一个过滤索引,我认为这将是有帮助的。

我同意@Neville K. SQL Server在内存中缓存数据方面非常聪明。您可能会看到您的努力获得的性能收益有限或没有。

您可以考虑为子查询索引视图(仅限企业版)http://technet.microsoft.com/en-us/library/cc917715.aspx。

当然,这样做是可能的,但我不确定它是否有帮助。

您可以创建一个计划作业(可能每晚一次),它通过截断一个名为"active_users_with_share_info"的表来填充它,然后根据一个select查询(用"share_info = true"过滤掉过去180天内活动的用户)来重新填充它。

然后你可以把你的搜索查询连接到这个表。

然而,我怀疑这将做得很好- SQL Server是相当聪明的缓存。除非您正在处理大量数据(1亿条记录),或者硬件非常有限,否则我怀疑您不会获得任何可衡量的性能改进——但请务必尝试一下!

当然,这样做的代价是应用程序中有更多的活动部件,更多有趣的故障模式(如果一夜之间批处理无声地失败了会发生什么?),以及为您带入团队的任何新开发人员提供更多的培训。

最新更新