為SQL Server提供的可用內存越多,SQL Server就有越多的資源使用於緩沖區,即可減少服務器從磁盤讀取數據以獲取靜態信息或編譯過程計劃的次數。調整SQL Server所占內存可通過在服務器配置文件中設置total memory參數進行,該參數的值指定了SQL Server在啟動時所需的內存總量,如若該值為10000頁,則SQL Server在啟動時就將試圖獲得10000*2KB=19.5MB的內存,若不能滿足則啟動失敗。
注意:若操作系統在進程的整個生命周期中支持動態內存分配,則可在SQL Server啟動後為其分配額外的內存。
SQL Server啟動時將內存分配給SQL Server可執行代碼,SQL Server使用的靜態內存,用戶可配置參數占用的內存及不駐留在緩存上的數據結構,剩余的內存分配給兩種SQL Server緩沖區即:數據緩沖區和過程緩沖區。兩緩沖區的大小對整個系統的性能影響很大,在一個開發系統上可能要增加過多端程緩沖區的專用內存,而在一生產系統上則需減少過程緩沖區大小以便獲得更大的數據緩沖區。
1、確定緩沖區大小
在total memory配置的總空間中,首先要除去可愛執行代碼所占空間,其大小因平台和版本不同而異,可使用sp_configure查詢executable codesize參數的值得知,一般為3-4MB;其次需除去內部結構所占空間,內部結構分成內核結構和服務器結構,亦可將此部分內存看成靜態開銷和用戶配置參數占用兩個部分,前者大小不受用戶可配置參數的影響,一般為2-3MB,而後者即用戶可配置參數的大小則取決於配置參數的類型及其值的大小,包括number of user connections,number of open databases,number of devices,number of open objects,number of locks等,要得到這些用戶配置參數使用內存大小的精確估計,可調用不帶選項的sp_configure以顯示所有參數和每個參數使用的內存量,其和即是用戶配置參數所占用內存。
除去上述占用,剩余內存將以procedure cache percent配置參數的值按比例分配給過程緩沖區和數據緩沖區,例若值為20,即表示剩余內存的20%分配給過程緩沖區而80%分配給數據緩沖區。確定緩沖區大小的另一種方法是檢查SQL SERVE啟動時寫入SQL Server錯誤日志的內存信息,其中准確地說明了分配給過程緩沖區和數據緩沖區的數據量,以及多少個過程或其他編譯對象能同時駐留在緩沖區中,如相關信息為:
Server:Number of proc buffers assocated:556
Server:Number of blocks left for proc headers:629
Server:Memory allocated for the default data cache:4144kb
前兩行為過程緩沖區信息,過程緩沖區總大小是分配給過程緩沖區的內存(第一行)及分配給過程頭(即存放編譯對象如存儲過程的地方,根據被存儲對象的大小,可能需要一個或多個過程頭)的內存(第二行)之和,可存儲在過程緩沖區中的編譯對象受到此二者中較小者的限制。上述信息中,第一行指明了分配給過程緩沖區的緩沖區數量為556KB,每個緩沖區大小為76B,故過程緩沖區大小即為42256B,合21頁;第二行則指明了分配給過程頭的空間為629頁,由此可以得出,過程緩沖區總大小為629+21=650頁,合1.27MB。
信息中第三行則指明了分配給默認數據庫緩沖區的空間大小。此外,若配置了命名緩沖區,則相關信息還將包含每個命名緩沖區的信息,再加上這些命名緩沖區所占內存大小即得到總的數據緩沖區大小。欲知數據緩沖區大小還可通過sp_helpcache過程得到每個緩沖區和捆綁到這些緩沖區中的對象以及與不同緩沖區大小相關的開銷的詳細信息。