標籤:
SQLServer儲存引擎之記憶體篇:
(1)SQL SERVER 記憶體結構
SQL SERVER 記憶體結構簡圖
SQL SERVER 記憶體空間主要可分為兩部分:
(1.1)可執行代碼(Executable Code)
主要包括SQL SERVER 執行個體中的一些EXE和DLL檔案
(0)SQL SERVER 引擎(SQL SERVER ENGINE),SQL SERVER 資料庫的主程式;
(1)服務端網路程式庫(SERVER NET-LIBRARY),用於與用戶端網路程式庫通訊,將TDS包交給開放資料服務(OPEN DATA SERVICES),關於SQL SERVER訪問的內容會在《SQL SERVER 體系架構》中作介紹;
(2)開放資料服務(OPEN DATA SERVICES),用於將TDS包中的SQL 陳述式還原,交給關聯式引擎,關於關聯式引擎的內容會在《SQL SERVER 關聯式引擎》中作介紹;
(3)分散式查詢(DISTRIBUTED QUERIES),用於支援從異構資料來源中訪問資料(也包括從SQL SERVER到SQL SERVER),這裡載入訪問異構資料來源的OLE DB PROVIDER;
(4)擴充預存程序(EXTENDED STORED PROCEDURES),在後續版本中將徹底用CLR整合來取代擴充預存程序;
(5)OLE自動化(OLE AUTOMATION),用於SQL SERVER引用OLEAutomation 物件,事實上也是擴充預存程序,單獨列出只是因為其功能特殊性;
(1.2)、緩衝池(Buffer Pool)
(0)系統級資料結構(SYSTEM-LEVEL DATA STRUCTURES),資料執行個體上的全域資訊,包括資料庫描述、鎖、正在引用的對象及資料庫等;
(1)串連上下文(CONNECTION CONTEXT),有點類似WEB應用程式中SESSION的概念,包含當前資料庫連接及狀態,預存程序的參數、遊標的當前位置、所引用的表等;
(2)過程緩衝(PROCEDURE CACHE),所有預存程序或SQL語句的執行計畫,如果SQL語句存在相應的執行計畫,則直接使用該執行計畫,無須再次編譯SQL語句。效能計數器PLAN CACHE中的快取命中率(CACHE HIT RATIO)就是指的這裡。
(3)資料緩衝(DATA CACHE), 用於資料庫資料或索引頁的讀寫,效能計數器BUFFER MANAGER中的快取命中率(BUFFER CACHE HIT RATIO)就是指的這裡。在實體記憶體充足的情況下,通常這個值會高於90%乃至更高,只有很少的資料頁需要去物理讀,如果低於90%可能是需要擴充實體記憶體了;
(4)日誌緩衝(LOG CACHE),用於資料庫日誌頁的讀寫,每一次的DML都會在這裡產生相應的REDO日誌操作,如果復原事務的話,還會根據REDO日誌產生相應的反向REDO日誌;
只有過程緩衝、資料緩衝、日誌緩衝的大小是由SQL SERVER根據效能需要動態管理的,而其他記憶體空間則是隨著使用者請求的發起在變化。
(2)SQL SERVER記憶體管理
(2.1)進程地址空間
進程地址空間結構圖
(0)VAS(Virtual Address Space):進程地址空間或者叫虛擬位址空間,也即是記憶體定址空間,32位的CPU與作業系統(以下簡稱32系統),定址空間為2的32次方,即4G;
(1)3GB:32位WINDOWS系統上4G的定址空間,應用程式只有2G的訪問權(即使用者類比地址空間),剩下的2G留給作業系統自己(即核心類比地址空間),通過開啟3GB選項,可以讓應用程式定址3G的地址空間;
(2)PAE(Physical Addressing Extensions):實體位址延伸,將32位WINDOWS系統的定址空間提升到2的36次方,即64G,AWE(Address Windows Extension)是地址視窗擴充外掛程式或者叫API,應用程式可以通過AWE使用PAE的地址空間(先開啟作業系統的PAE,再實現應用程式的AWE);
(2.2)SQL SERVER記憶體管理
(0)SQL SERVER的緩衝池統一以8k作為記憶體塊大小,大於8k的大記憶體塊是被獨立管理的,從緩衝池外通過作業系統直接分配;
(1)AWE記憶體只能用於資料緩衝,其他記憶體組件是無法使用AWE記憶體的;
(2)鎖定記憶體頁(Lock Pages In Memory),將這個作業系統策略指定給啟動SQL SERVER服務的使用者,以阻止SQL SERVER從實體記憶體到page file的交換。在開啟AWE時,對於除local system以外的SQL Server服務啟動使用者,必須要顯式分配lock pages in memory的許可權;
(3)SQL SERVER隨著使用者串連和請求的增加,會不斷去擷取實體記憶體,直至達到目標記憶體(TARGET MEMORY)和最大伺服器記憶體(MAX SERVER MEMORY)中較小的一個。如果SQL SERVER伺服器上作業系統沒有自由記憶體,或其他應用程式有記憶體壓力存在,SQL SERVER會調整其目標記憶體大小,也會釋放實體記憶體,但不會釋放到低於最小伺服器記憶體(MIN SERVER MEMORY);如果沒有其他記憶體壓力,SQL SERVER在繁忙時擷取的記憶體不會在空閑時主動釋放。
--------------------------------------------------------------------------------------
原文轉自:http://qianzhang.blog.51cto.com/317608/1217346
--------------------------------------------------------------------------------------
SQLServer儲存引擎——記憶體