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

时间:2011-10-20 09:25:48

标签: sql database sql-server-2005

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

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

我使用的是Sql-Server 2005,因此无法在表格上创建过滤索引,我认为这样做会有所帮助。

2 个答案:

答案 0 :(得分:1)

我同意@Neville K. SQL Server非常聪明地在内存中缓存数据。您可能会看到有限/无性能提升。

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

答案 1 :(得分:0)

当然可以这样做 - 但我不确定它是否会有所帮助。

您可以创建一个预定作业 - 可能是每晚一次 - 通过截断它来填充名为“active_users_with_share_info”的表,然后根据选择查询重新填充它,过滤掉过去180天内活动的用户“share_info =真正”。

然后,您可以将搜索查询加入此表格。

但是,我怀疑这会有多大好处 - SQL Server在缓存方面非常聪明。除非您处理大量数据(数百万条记录)或非常有限的硬件,否则我怀疑您是否会获得任何可衡量的性能改进 - 但无论如何都要尝试一下!

当然,这样做的代价是你的应用程序中更多的移动部件,更有趣的故障模式(如果隔夜批次无声地失败会发生什么?),以及对你带入团队的任何新开发人员的更多培训。