共計 3913 個字符,預計需要花費 10 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關 sql server 中內存的示例分析,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
一. 前言
對于 sql server 這個產品來說,內存這塊是最重要的一個資源,當我們新建一個會話,相同的 sql 語句查詢第二次查詢時間往往會比第一次快,特別是在 sql 統計或大量查詢數據輸出時,會有這么感覺。除了第一次要編譯生成執行計劃, 在 CPU,I/O 的影響外,最主要的是第二次查詢是從內存緩存中讀出,為什么是這樣,sql server 內存里存儲了什么,它與 windows 內存又有什么區別?
二. 內存和硬盤
為什么內存是寶貴的,在每個系統上都是有限的,就像你看到的 1 tb 的硬盤,但是你通常看到的是 50-200 G 的內存,物理內存的訪問速度非常快,不能超過一定的限制。在內存有限的情況下,如果所有的進程都使用了有限的內存,并且新的進程將無法為他們找到任何內存,這就出現了虛擬地址空間的概念(也稱為 VAS)。
Virtual Address Space(虛擬地址空間)
是指一個應用程序能夠申請訪問的最大地址空間。32 位尋址空間最大是 4G, 64 位尋址空間最大是 8TB。
VAS 作為中間的抽象層的, 不是所有的請求都直接映射到物理內存, 它首先映射到 VAS 然后映射到物理內存。因此,它可以更協調的方式管理對內存的請求,而不是讓進程去做,如果不是這樣,它很快就會導致內存崩潰。
在 Windows 操作系統中,VAS 的內核進程與用戶進程之間的劃分是相同的。對于 32 位系統,最大的 VAS 是 4 G 的內核 / 2 G 到應用程序的中,在這里,SQL Server 是應用程序進程,當我使用 word 進程時,它意味 SQL Server 進程差不多一樣,將得到 2 G 的 VAS。因此,從理論上講,這意味著任何應用程序進程在 32 位上運行的都將擁有最大限度的 2 G。
三 sql server 內存 架構
sql server 內存管理,在 sql server 2012 發生了重大改變,對內存重新實現了一遍。 先看下版本之間內存管理圖的區別
名詞術語
3.1 BufferPool
SQL Server 使用 BufferPool 緩沖池來有效地管理 SQL Server 進程的內存請求。它是 SQL Server 的最大內存消耗者。緩沖區是內存中的一個 8 KB 的頁面,與數據或索引頁面大小相同,您可以將緩沖區看作是一個框架,它在從磁盤到內存的時候保存數據和索引頁。
SQL Server 緩沖區管理器管理將數據頁讀入緩沖池的任務,并將其寫入磁盤。它是 SQL Server 的預留內存存儲,如果您不為它設置值,它將占用盡可能多的內存。因此,在 spconfigure 中為 max server 內存設置最佳值總是被推薦為一種良好的實踐。緩沖池只將內存分配給需要少于 8 KB 頁面的請求。
對于大于 8 KB 內存的所有請求,都是由 windows API 直接分配的。所有緩存存儲計劃、數據和索引頁都存儲在這個緩沖池中。當用戶請求 row/rows 時,如果緩沖區池中沒有,則使該頁面從磁盤進入內存。這種輸入 / 輸出可能在繁忙的系統上特別昂貴,因此盡可能減少 SQL 服務器緩存的大小,這可能會被用戶看作是內存泄漏或 SQL Server 占用大量內存,但實際上它提高了性能,實際上這個特性是通過設計實現的。
下面這些內存不是來自緩沖池:
SQL LCR
擴展存儲過程
鏈接服務器分配的內存
內存管理器完成的大頁面分配(大頁面為任意頁面>8 KB)
COM 對象
3.2 single-page
這塊內存是 =8kb 的存儲,適用于 sql server 2008 及以前,屬于 buffer pool 緩沖池來分配。有存儲數據頁面,Consumer 功能組件。
3.3 multi- page
這塊內存是 8kb 的 存儲,適用于 sql server 2008 及以前,不屬于 buffer pool 緩沖池來分配, 有存儲 Consumer 功能組件, 第三方代碼, Threads 線程。
3.4 any size page
這個適用于 sql server 2012 及以上,整合了 single-page,multi-page 統稱 pages。
四. sql server 2008 內存
從內存圖我們可以看到有 page reservation 需預先申請的內存,有 momory objects 從 windows api 申請的內存, 有 clr 第三方申請的內存。
內存的分類方式有很多,下面介紹三種方式:
1. 按用途分類
1.1 Database Cache(數據頁面緩沖區)
當用戶修改了某個頁面上的數據時,sql server 會在頁存中將這個頁修改。但不會立刻將這個頁面寫回硬盤,而是等后面的 checkpoint 或 lazy write 集中處理。
1.2 各類 Consumer 功能組件
Connection 連接:包括輸入緩沖池和輸出緩沖池, 用來存儲用戶指令和返回結果。
General:一組大雜燴: 語句,語句編譯,范式化,鎖數據結構,事務上下文,表格,索引的元數據等。
Query paln:語句和存儲過程的執行計劃。
Optimizer:sql server 在生成執行計劃的過程中需要消耗的內存。
Utilities:像 BCP, Log Manager,Parallel Queries,Backup
1.3 線程內存
為每個線程分配 0.5MB 的內存
1.4 第三方代碼申請的內存
如用戶定義的 CLR,Linked Server 分布式查詢從遠程數據庫取回大量數據。
2. 按申請方式分類
申請方式是指要先預先 Reserve 一塊大的內存,然后再一小塊一小塊的 commit。對 Database Cache 是會先 Reserve,再 commit。
其他所有內存使用,基本都是直接 commit,都叫 Stolen。
3. 按申請大小分類(上面的內存圖就是這種分類)
有二種內存申請單位: 一種是小于或等于 8KB 的,稱為 Buffer Pool,一次一個頁面的這種分配,被稱為 single page allocation.
一種是大于 8kb 的,稱為 Multi-page(以前叫 MemToLeave), 這種分配,被稱為 Multiple Page Allocation.
注意這里的很大一部分內存不受 sql server 本身控制. 因為第三方代碼申請的內存都放在 Multi-page 里.
內存分類方法之間的關系
類型
Database cache
數據頁面緩沖區
Consumer
功能組件
3 Party code
第三方代碼
Threads
線程
Reserved/Commit
是
一般不是
一般不是
不是
Stolen
不是
是
是
是
Buffer Pool
(single- page)
所有
絕大部分
沒有
沒有
MemToLeave
(Multi -page)
沒有
一小部分
所有
所有
五.sql server 2012 內存
在 sql server 2012 里,single page allocator 和 multi page allocator 統一起來了,叫做 any size page allocator。max server memory 不再像以前的版本那樣,只控制 buffer pool 的大小,也包括那些大于 8kb 的內存請求。也就是 max server memory 能夠更準確地控制 SQL Server 的內存使用了。
如下圖所示:
使用 dmv 來查看當前實例的總內存空間,以及占用內存空間
–Target Server Memory (KB) 最多能申請的內存量
–Total Server Memory (KB) 目前使用了多少內存量
從下面的空間占用也可以看出來,給 sql server 有分配多少內存,它就會占用多少內存,以達到性能的最優。
select counter_name, ltrim(cntr_value*1.0/1024.0/1024.0)+ G
as memoryGB from master.sys.dm_os_performance_counters
where counter_name like %target%server%memory% or counter_name like %total%memory%
六 總結
當您啟動 Microsoft SQL Server 時,SQL Server 內存使用量可能會繼續穩步增長,而不是減少,即使服務器上的活動很低。此外,任務管理器和性能監視器可能顯示,計算機上可用的物理內存會逐漸減少,直到可用內存在 4 MB 到 10 MB 之間。這種行為本身并不表示內存泄漏。這種行為是典型的,并且是 SQL Server 緩沖池的預期行為。
默認情況下,SQL Server 根據操作系統報告的物理內存負載動態地增長和縮小緩沖池(緩存)的大小。只要有足夠的內存(4 MB 和 10 MB)可以防止分頁,那么 SQL Server 緩沖池就會繼續增長。當與 SQL Server 在同一臺計算機上分配內存時,SQL Server 緩沖管理器將根據需要釋放內存。SQL Server 可以每秒釋放數兆字節的內存。這允許 SQL Server 快速地適應內存分配更改。
您可以為 SQL Server 數據庫引擎使用最小服務器內存和最大服務器內存配置選項使用多少內存(緩沖池)設置上限和下限
請注意,通過上圖設置內存最大 max 只限制 SQL Server 緩沖池的大小。不限制 SQL Server 為其他組件分配的剩余未保留內存區域,如擴展存儲過程、COM 對象、非共享 dll、EXEs 和 MAPI 組件。由于之前的分配,SQL Server 私有字節的數量超過了最大服務器內存配置。
關于“sql server 中內存的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。