程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 優化SQL Server的內存占用之執行緩存

優化SQL Server的內存占用之執行緩存

編輯:關於SqlServer

在論壇上常見有朋友抱怨,說SQL Server太吃內存了。這裡筆者根據經驗簡單介紹一下內存相關的調優知識。首先說明一下SQL Server內存占用由哪幾部分組成。SQL Server占用的內存主要由三部分組成:數據緩存(Data Buffer)、執行緩存(Procedure Cache)、以及SQL Server引擎程序。SQL Server引擎程序所占用緩存一般相對變化不大,則我們進行內存調優的主要著眼點在數據緩存和執行緩存的控制上。本文主要介紹一下執行緩存的調優。數據緩存的調優將在另外的文章中介紹。

對於減少執行緩存的占用,主要可以通過使用參數化查詢減少內存占用。

1、使用參數化查詢減少執行緩存占用

我們通過如下例子來說明一下使用參數化查詢對緩存占用的影響。為方便試驗,我們使用了一台沒有其它負載的SQL Server進行如下實驗。

下面的腳本循環執行一個簡單的查詢,共執行10000次。

首先,我們清空一下SQL Server已經占用的緩存:

dbcc freeproccache

然後,執行腳本:

  DECLARE @t datetime
  SET @t = getdate()
  SET NOCOUNT ON
  DECLARE @i INT, @count INT, @sql nvarchar(4000)
  SET @i = 20000
  WHILE @i <= 30000
  BEGIN
  SET @sql = 'SELECT @count=count(*) FROM P_Order WHERE MobileNo = ' + cast( @i as varchar(10) )
  EXEC sp_executesql @sql ,N'@count INT OUTPUT', @count OUTPUT
  SET @i = @i + 1
  END
  PRINT DATEDIFF( second, @t, current_timestamp )

輸出:

DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。

11

使用了11秒完成10000次查詢。

我們看一下SQL Server緩存中所占用的查詢計劃:

Select Count(*) CNT,sum(size_in_bytes) TotalSize

From sys.dm_exec_cached_plans

查詢結果:共有2628條執行計劃緩存在SQL Server中。它們所占用的緩存達到:

92172288字節 = 90012KB = 87 MB。

我們也可以使用dbcc memorystatus 命令來檢查SQL Server的執行緩存和數據緩存占用。

執行結果如下:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved