2011-04-21 93 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

不要錯過明顯的,你也可以創建一個完全獨立的報表,並每小時更新。雖然在填充和管理它時會有成本,但您可以將這些字段限制爲所需內容並優化讀取索引。