標籤:io 使用 資料 sp c on cti 代碼 r
第一類、
根據申請方式分:
commit 型
它是指先reserve申請一大塊,再通過commit提交後得到的空間。這種方式申請到的空間可以啟用 awe !
stolen型
與commit 相對應!它不用reserve只是直接申請。它不能申請 AWE 擴充出的記憶體。
第二類、
根據申請空間的大小分:
single page allocation(buffer pool)型:
如果要申請的空間大小小於8KB SQL Server會慷慨的分給8KB(一個資料頁)!
multiple page allocation(MemToLeave)型:
如果申請的頁面記憶體大於8KB 、它申請多 SQL Server 就給它多少!
-----------------------------------------------------------------------------------------------------------------------------------------------
總結:
1、database cache 由雩都是資料頁、所以它儲存在single page allocation(buffer pool)裡
2、connection 它儲存在哪這個它自己說了不算,要看network package size 的臉色、
network package size預設是4KB所以connection 預設儲存在single page allocation(buffer pool)裡,不幸的是
network package size 的大小是可以通過 sp_configure 調整的。所以connection 也可能儲存在multiple page allocation中
3、 general (鎖的資料結構、事務上下文、表格索引的中繼資料)它們也是動態,如果它們比較小就儲存在single page allocation中
如果你把語句寫的比較長它們就儲存在multiple page allocation 中
4、第三方的代碼、SQL server是不知道它有多長的、所以把它儲存在mulitple page allocation 中。
5、線程、因為每個線程的資料結構大小最小為512KB、所以把它儲存在mulitple page allocation 中。
下面說明一下記憶體的去向、
(以下以32位系統 4G記憶體為例,256 線程)
1、multiple page allocation:
之所以又叫 MemToLeave 是因為SQL Server 在啟動時把這塊地址預留了一下、預留多少
是這樣算出來的。 256 + threads*0.5MB ; threads 是指最大線程數、可以通過sp_configure查看。
根據上面運算式可以算出 multiple page allocation = 384MB;當sql server的mulitple page allocation
到達384MB時、sql server 也就再也沒有辦法申請這種記憶體了。
2、single page allocation :
multiple page allocation 的大小確定後 、single page allocation 的大小也就知道了
single page allocation = (2G - 384MB) = 1664MB 、也就是 single page allocation 的最大值
SQL server 剛剛啟動時用不了 1664MB、當sql server 使用量達到 1664MB 或 max server memory
參數所指定的值時、sql server就再也不能申請這種記憶體了、single page allocation 的值也就被限制了下來。
然、
如果記憶體大於 4G 也就說使用者太的記憶體也就大於2G、且開啟了 AWE 的話、多餘的記憶體也是可以被使用上的。
前面說了AWE 的記憶體只可以通過 reserve\commit 方式供database cache 使用,別的用不了這塊記憶體,這
樣 singel page allocation 的stolen 最多可以用 1664MB ,database cache 可以用AWE 擴充出來的空間。
然、
如果在64的機器上裝 32位的SQL Server 、因為64位的作業系統不用32位應用程式的地址空間、所以啊SQL
server 最高可用4G; 所以 single page allocation = (4G-384) = 3664MB;
SQL server 用最近最少使用演算法淘汰記憶體中的頁面。
SQL Server 的記憶體分類