缓存SQL查询

时间:2011-04-21 11:52:40

标签: sql sql-server caching

如果我在我的探查器中查找SQL-server,它会出现很多重复的查询,例如:

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小时,目的是提高记录的检索速度。

4 个答案:

答案 0 :(得分:3)

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

如果您有一个昂贵的聚合查询,您希望“缓存”,请创建一个索引视图以实现结果。

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

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

答案 1 :(得分:1)

不,但有很多缓存解决方案,例如 http://memcached.org/ http://ehcache.org/

答案 2 :(得分:1)

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

这是尽可能避免表扫描的主要原因。如果正在扫描的表足够大,那么您的缓存会充斥着可能无用的数据。

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

答案 3 :(得分:0)

不要错过显而易见的事实,您还可以创建一个完全独立的报表,并按小时更新。虽然填充和管理它会有成本,但您可以将字段限制为所需的字段并优化读取的索引。