SQL Server內存的管理方法
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
以下的文章主要向大家講述的是SQL Server內存的管理,在默認的情況下,SQL Server 2000數據庫其為了平衡運行在機器上得其他一些應用程序與數據庫系統內部其他組建對內存的需要,實現對系統內存的動態分配和回收。 在早前的版本如7.0,你通過選項配置給SQL Server設定一個大小固定的內存;然而。除非你有具體的問題要求分配大小規定的內存,否則最好是讓SQL Server動態管理內存。 無論內存是以動態還是固定的方式進行分配,計算機系統為每個SQL Server實例分配的總的內存空間都可看做一個單個統一的緩沖區(unified cache),這些內存都以多種內存池(memory pool)的方式進行管理。每個內存池有各自的策略和用途,系統中的各個內部組件可以請求和授權使用池中的內存。 緩沖區管理和內存池(The Buffer Manager an Memory Pools) SQL Server內存組件是緩沖池(buffer pool)。任何不被其他內存相關組件使用的內存都放在緩沖池中。緩沖池負責從硬盤上加載數據和索引頁以供用戶訪問和共享數據。當其他組件申請內存時,它們向緩沖池發送一個緩沖請求。內存緩沖由若干個頁組成,其中每頁大小與數據或索引頁大小相同(8K)。 緩沖區管理器(The buffer Manager) SQL Server的進程(process)只能訪問內存中的數據或索引頁。不允許直接訪問磁盤上的頁。緩沖區管理器(The buffer Manager)是一個用來管理和控制物理磁盤中的頁在內存中的進程。當某個進程需要訪問數據或索引頁時,該頁必須首先在緩沖區存在。 如果訪問的頁在內存中不存在,則必須進行一次物理I/O訪問來加載該頁,這樣進程就可以訪問該頁在內從中的拷貝了。因為物理I/O的訪問是非常昂貴和耗時的,所以盡可能減少系統的物理I/O。一種解決方案就是給SQL Server提供更多內存。越多的頁駐留在內存,當某個頁被訪問時就越有可能在內存中找到該頁。 內存緩沖區的訪問(Accessing Memory Buffers) 對SQL Server中進程來講,一個數據庫就像帶有編號頁的簡單序列。數據庫中的頁可以用數據庫編號、文件編號、頁的編號來唯一標識。當一個進程訪問一個頁時,它向緩沖管理器發送一個請求,該請求指出要訪問數據所在的數據庫編號、文件編號、和頁編號。 為了更快地訪問內存中的數據和避免數據頁的SQL Server內存掃描(memory scans),對緩沖池的頁進行散列處理,以提供更快地訪問。散列(Hashing)是一種同過一個散列函數把一個key映射到一個散列桶(hansh bucket)的技術。散列桶是一種內存中的數據結構,該數據結構包含一個指針數組(以鏈表方式實現),每個指針指向一個緩沖頁(buffer page)。 A linked list chain of hash pages is built when the pointers to buffer pages do not fit on a single hash page. 散列桶的數量是SQL Server根據緩沖池大小動態進行調整。 在SQL Server中,散列值是由數據庫編號、文件編號、頁編號相結合生成的。散列函數生成散列值并保存在散列桶中。本質來講,散列桶就是訪問內存頁的一個索引。即使在一個大的內存環境中,散列技術可以允許SQL Server快速查找內存中的具體數據頁而這需要一些內存讀操作。 利用散列算法也讓SQL Server快速判斷某個請求的頁是否在內存中,而不需要一個內存緩沖區的掃描。 如果被請求的頁在內存中,緩沖區管理者返回一個指向SQL Server內存緩沖區的指針,該內存緩沖區即為該進程請求的數據頁。如果頁不在內存中,則緩沖區管理者必須首先進行一次磁盤I/O操作把請求頁讀到內存緩沖區中,然后把指向該內存的指針返回給發送請求的進程。 如果請求頁的進程最終對頁中的任何信息進行了修改,該頁就被標記為“臟頁(dirty)”,當進行完成了對頁的修改,緩沖區管理者會收到一個通知。緩沖區管理者協同日志和事務管理者,負責確保被修改的頁寫到了磁盤上。 該文章在 2011/5/5 22:05:31 編輯過 |
關鍵字查詢
相關文章
正在查詢... |