2011-04-21 164 views
4

如果我看在我分析器用于SQL服务器,它有很多重复的查询,如出现:缓存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-server)上有类似的功能,它将查询结果保存在缓存中并在设定的时间段后更新该缓存时间,比如1小时,目的是提高记录的检索速度。

回答

3

在SQL Server 2000和之前,你可以使用DBCC PINTABLE(databaseid,TABLEID),但其最好让SQL Server来管理你的记忆

如果你有,你想一个昂贵的汇总查询“网页快照“,创建一个索引视图来实现结果。

否则,数据库页保留在内存中的时间量由最近最少使用的策略决定。缓存中每个数据页面的标题存储了最近两次访问的详细信息。后台进程扫描缓存,如果自上次扫描以来尚未访问过该页面,则递减一个usecount。当SQL Server需要释放缓存时,首先刷新使用率最低的页面。 (专业的SQL Server 2008和内幕和故障排除)

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

1

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

这是在可能的情况下避免表扫描的主要原因。如果正在扫描的表足够大,您的缓存将被潜在无用的数据充斥。

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

0

不要错过明显的,你也可以创建一个完全独立的报表,并每小时更新。虽然在填充和管理它时会有成本,但您可以将这些字段限制为所需内容并优化读取索引。