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引用OLE自動化對象,事實上也是擴展存儲過程,單獨列出只是由於其功能特殊性;
(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
--------------------------------------------------------------------------------------