【问题标题】:Caching SQL queries缓存 SQL 查询
【发布时间】:2011-04-21 11:52:40
【问题描述】:

如果我查看 SQL 服务器的分析器,它会出现很多重复的查询,例如:

exec sp_executesql N'SELECT *
FROM [dbo].[tblSpecifications] AS [t0]
WHERE [t0].[clientID] = @p0
ORDER BY [t0].[Title]', N'@p0 int', @p0 = 21

很多这样的查询不需要显示实时数据,也就是说,如果有人插入了一条与该查询匹配的新记录,那么插入后一小时内它是否不显示也没关系.

您可以输出缓存 asp.net 页面,但我想知道在 dbms(特别是 SQL 服务器)上是否有类似的功能,它将查询结果保存在缓存中并在设定的一段时间后更新缓存时间,比如 1 小时,目的是提高记录的检索速度。

【问题讨论】:

    标签: sql sql-server caching


    【解决方案1】:

    在 SQL Server 2000 及之前的版本中,您可以使用 DBCC PINTABLE (databaseid, tableid),但最好让 SQL Server 管理您的内存

    如果您想要“缓存”一个昂贵的聚合查询,请创建一个索引视图来具体化结果。

    否则,数据库页面在内存中保留的时间由最近最少使用的策略确定。缓存中每个数据页的标头存储有关最近两次访问的详细信息。后台进程扫描缓存,如果自上次扫描以来尚未访问该页面,则减少使用计数。当 SQL Server 需要释放缓存时,首先刷新使用计数最低的页面。 (Professional SQL Server 2008 Internals and Troubleshooting)

    sys.dm_os_buffer_descriptors 为当前缓存中的每个数据页包含一行

    【讨论】:

      【解决方案2】:

      查询结果不会被缓存,但数据页本身会一直保留在缓存中,直到它们被其他读取操作推出。他们下次提交查询时,这些页面将从内存而不是磁盘中读取。

      这是尽可能避免表扫描的主要原因。如果被扫描的表足够大,你的缓存就会被潜在的无用数据淹没。

      很多人都有“谁在乎查询需要多长时间,它以批处理模式运行”的态度,但他们看不到对其他进程的影响,比如你提到的那个。

      【讨论】:

        【解决方案3】:

        没有,但是有很多缓存解决方案,例如 MemcachedEhcache

        【讨论】:

          【解决方案4】:

          不要错过显而易见的事情,您还可以创建一个完全独立的报告表并每小时更新一次。虽然填充和管理它会产生成本,但您可以将字段限制在需要的范围内并优化读取索引。

          【讨论】:

            猜你喜欢
            • 2016-03-22
            • 1970-01-01
            • 1970-01-01
            • 2011-08-10
            • 2021-11-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多