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

SQL 2005緩存計劃小結

編輯:關於SqlServer

緩存計劃可以被分成兩類:編譯的計劃和執行上下文。前者是對所有用戶共享的,後者是針對某個特定用戶的,它包含了某個用戶執行此計劃時的具體參數等相關的信息。編譯的計劃有四種類型,可以通過下面的語句進行查看:

SELECT *
FROM sys.dm_os_memory_cache_counters
WHERE name IN ('Object Plans', 'SQL Plans',
'Bound Trees', 'Extended Stored Procedures');

這四類分別對應於Object Plans(存儲過程、函數、觸發器),SQL Plans(即席查詢、自動參數化、SP_EXECUTESQL執行的語句),Bound Trees(生成計劃時代數化階段所生成的結構),Extended Stored Procedures(擴展存儲過程)。

執行上下文被存儲於稱為SQL Manager Cache (SQLMGR)的地方。如果緩沖區到達上限時,SQLSERVER會先釋放掉SQLMGR這部分的內存,因為它們的編譯成本是0。而編譯的計劃成本會被減半,如果成本到達0後也會被釋放。

SQL2005的過程緩存是動態分配的,它的最大大小由下面的公式計算得到:

這裡所指的visible target memory是當使用DBCC MEMORYSTATUS命令時在Buffer Counts的結果集中的Visible行返回的大小。如下圖所示:

如果是64位的操作系統Target和Visible兩者是相等的。Target是系統的可見內存和SQLSERVER最大可用內存兩者中較小的那個。如果是32位系統,當設置了/3GB啟動參數此值最大為3G,否則最大為2G。

如果32位系統中使用了多於4G的內存時,假設你為SQLSERVER配置了AWE。則Target和Visible就不會再相等了。過程緩存是不能存放於AWE內存中的。

假設你在32位操作系統中運行 SQLSERVER2005SP2,系統中有16G內存。你為SQLSERVER配置了AWE,並且考慮到有SSRS、SSIS、FULLTEXT等SQL服務,你設置SQLSERVER引擎的最大可用內存為12G。此時使用DBCC MEMORYSTATUS命令應該看到Target的大小應該是1572864。因為Buffers列的值是代表緩沖區頁面的數量,每頁的大小為8K。因此12G的話應該是12*1024*1024/8=1572864個緩沖頁面。而此時的Visible是不等於Target的,假設當前Visible的值是2G。則過程緩存的最大大小就是2*0.75=1.5G。

如果是在64位系統中,則上面的計算公式為4*0.75+8*0.1=3.8G。我們看到SQL2005的SP2比SP1對過程緩沖區的大小做了更多的限制,這是為了防止因為有大量的緩存計劃而導致與數據緩存爭搶內存。

那麼一個批命令會不會有多個執行計劃呢?只有在改變了執行時的環境時才會生成另一個執行計劃。視圖sys.dm_exec_plan_attributes包含了某計劃的一些屬性信息,下面我們試驗一下改變執行環境後為同一批命令生成多個執行計劃,執行下面的語句:

我得到的結果如下:

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