亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server內部的內存管理

2024-08-31 00:53:40
字體:
來源:轉載
供稿:網友

1、內存使用分類

按用途分類
1)Database cache(數據頁面)。SQL Server中的頁面都是以8KB為一個頁面存儲的。當SQL Server需要用到某個頁面時,它會將該頁面讀到內存中,使用完后會緩存在內存中。在內存沒有壓力的情況下,SQL Server不會將頁面從內存中刪除。如果SQL Server感覺到內存的壓力時,會將最長時間沒有使用的頁面從內存中刪除來空出內存。
2)各類Consumer(功能組件)
Connection的連接信息
General:一組大雜燴。語句的編譯、范式化、每個鎖數據結構、事務上下文、表格和索引的元數據等
Query Plan:語句和存儲過程的執行計劃。和Database cache類似,SQL Server也會將執行計劃緩存以供將來使用,減少編譯時間。
Optimizer:生成執行計劃的過程中消耗的內存。
Utilities:像BCP、Log Manager、Backup等比較特殊的操作消耗的內存。
3)線程內存:存放進程內每個線程的數據結構和相關信息消耗的內存,每個線程需0.5MB的內存。
4)第三方代碼消耗的內存:SQL Server的進程里,會運行一些非SQL Server自身的代碼。例如:用戶定義的CLR或Extended Stored PRocedure代碼。
按申請方式分類
1)預先Reserve一塊大的內存,然后在使用的時候一塊一塊的Commit。Database Page是按這種方式申請的。
2)直接用Commit方式申請的內存,成為Stolen方式。除了Database Page之外其他內存基本都是按這種方式申請的。
按申請內存的大小分類
1)申請小于等于8KB為一個單位的內存,這些內存稱為Buffer Pool

2)申請大于8KB為一個單位的內存,這些內存稱為Multi-Page(或MemToLeave)

 
SQL Server對于Database cache都是采用先Reserved后Commit的方式申請的,而數據頁都是以8KB為單位進行申請的。
對于Consumer中的內存申請,一般都是按Stolen方式申請的,且大多數的執行計劃的大小都是小于8KB的,少數特別復雜的存儲過程的執行計劃會超過8KB,默認的連接的數據包是4KB,除非客戶端特別設置了超過8KB(不建議)
第三方代碼的內存申請一般是按Stolen方式申請的,個別比如CLR中可能會用Reserved/Commit的方式申請。
線程的內存每個都以0.5MB的方式申請,自然是放在MemToLeave中。
之所以花了這么大篇幅來講SQL Server的內存分類,是因為SQL Server尤其是32位的SQL Server對不同種類的內存的申請大小是不一樣的,對Commit、Stolen和MemTOLeave等類型的內存是有限制的。因此會出現系統中還有空閑內存,但是SQL Server不會申請使用的現象。
2、SQL Server內存使用情況的分析
一般來說有兩種方式,第一種就是用來分析系統內存情況時使用的用性能計數器來分析,第二種是使用動態管理視圖(DMV,只適用于SQL Server2005和2008)
1)SQL Server性能計數器
SQLServer:Memory Manager:Total Server Memory(KB):SQL Server緩沖區提交的內存。不是SQL Server總的使用內存,只是Buffer Pool中的大小。
SQLServer:Memory Manager:Target Server Memory(KB):服務器可供SQL Server使用的內存量。一般是由SQL Server能訪問到的內存量和SQL Server的sp_Configure配置中的Max Server Memory值中的較小值算得。
SQLServer:Memory Manger:Memory Grants Pending:等待內存授權的進程總數。如果該值不為0,說明當前有用戶的內存申請由于內存壓力被延遲,這意味著比較嚴重的內存瓶頸。
SQLServer:Buffer Manager:Buffer Cache Hit Ratio:數據從緩沖區中找到而不需要從硬盤中去取的百分比。SQL Server在運行一段時間后,該比率的變化應該很小,而且都應該在98%以上,如果在95%以下,說明有內存不足的問題。
SQLServer:Buffer Manager:Lazy Writes/Sec:每秒鐘被惰性編輯器(Lazy writer)寫入的緩沖數。當SQL Server感覺到內存壓力的時候,會將最久沒有使用的數據頁面和執行計劃從緩沖池中清理掉,做這個動作的就是Lazy Writer。
SQLServer:Buffer Manager:Page Life Expectancy:頁面不被引用后,在緩沖池中停留的秒數。在內存沒有壓力的情況下,頁面會一直待在緩沖池中,Page Life Expectancy會維持在一個比較高的值,如果有內存壓力時,Page Life Expectancy會下降。所以如果Page Life Expectancy不能維持在一個值上,就代表SQLServer有內存瓶頸。
SQLServer:Buffer Manager:Database Pages :就是Database Cache的大小。
SQLServer:Buffer Manager:Free Pages:SQL Server中空閑可用的大小。
SQLServer:Buffer Manager:Stolen Pages:Buffer Pool中Stolen的大小。
SQLServer:Buffer Manager:Total Pages: Buffer Pool的總大?。ǖ扔贒atabase Pages+Free Pages+Stolen Pages)。該值乘以8KB,應該等于Memory Manager:Total Server Memory的值。
從上面這些計數器中我們就能了解SQL Server的內存使用情況,結合前面說的系統層的計數器大概能看出是否存在內存瓶頸。
2)內存動態管理視圖
在SQL Server 2005以后,SQL Server的內存管理是使用Memory Clerk的方式統一管理。所有的SQL Server的內存的申請或釋放,都需要通過它們的Clerk,SQL Server也通過這些Clerk的協調來滿足不同需求。通過查詢這些DMV,可以得到比用性能計數器更加詳細的內存使用情況。
我們可以通過下面的查詢語句來檢測SQL Server的Clerk的內存使用情況。
使用sys.dm_os_memory_clerks查看內存使用情況
SELECT type, --Clerk的類型 
    sum(virtual_memory_reserved_kb) as vm_Reserved_kb, -- 保留的內存 
    sum(virtual_memory_committed_kb) as vm_Committed_kb, --提交的內存 
    sum(awe_allocated_kb) as awe_Allocated_kb, -- 開啟AWE后使用的內存 
    sum(shared_memory_reserved_kb) as sm_Reserved_kb, -- 共享的保留內存 
    sum(shared_memory_committed_kb) as sm_Committed_kb, -- 共享的提交內存 
    sum(single_pages_kb) as SinlgePage_kb, --Buffer Pool中的Stolen的內存 
    sum(multi_pages_kb) as Multipage_kb -- MemToLeave的內存 
FROM sys.dm_os_memory_clerks  
GROUP BY type 
ORDER BY type
從上面的查詢語句,我們可以算出前面提到的內存大小
Reserved/Commit = sum(virtual_memory_reserved_kb) / sum(virtual_memory_committed_kb) 
Stolen = sum(single_pages_kb) + sum(multi_pages_kb) 
Buffer Pool = sum(virtual_memory_committed_kb) + sum(single_pages_kb) 
MemToLeave = sum(multi_pages_kb)
通過上面的介紹我們可以知道SQL Server總體和各部分內存的使用情況,如果我想知道數據頁的緩存中到底緩存了哪些數據,這些數據是屬于哪個數據庫的哪個表中的呢?執行計劃又是緩存了哪些語句的執行計劃呢?這也可以通過DMV查看的到。
查看內存中的數據頁面緩存的是哪個數據庫的哪個表格的數據
declare @name nvarchar(100) 
declare @cmd nvarchar(1000) 
declare dbnames cursor for
select name from master.dbo.sysdatabases 
open dbnames 
fetch next from dbnames into @name
while @@fetch_status = 0 
begin
set @cmd = 'select b.database_id, db=db_name(b.database_id),p.object_id,p.index_id,buffer_count=count(*) from '  
--這里的object_id代表是SQL Server中的對象號,index_id代表是索引號,buffer_count代表的是頁面數 
+ @name + '.sys.allocation_units a, '
+ @name + '.sys.dm_os_buffer_descriptors b, ' + @name + '.sys.partitions p 
where a.allocation_unit_id = b.allocation_unit_id 
and a.container_id = p.hobt_id 
and b.database_id = db_id(''' + @name + ''') 
group by b.database_id,p.object_id, p.index_id 
order by b.database_id, buffer_count desc'  
exec (@cmd) 
fetch next from dbnames into @name
end
close dbnames 
deallocate dbnames 
go
-- 根據上面取出來的@object_id找出是哪個數據庫的哪個表
SELECT    s.name AS table_schema, o.name as table_name --使用的就是table_schema.table_name表 
FROM    sys.sysobjects AS o INNER JOIN
          sys.schemas AS s ON o.uid = s.schema_id 
WHERE    (o.id = @object_id)
-- 根據上面取出來的@object_id和@index_id找出索引的名稱
SELECT    id, indid, name as index_name -- index_name就是索引的名稱 
FROM    sys.sysindexes 
WHERE    (id = @object_id) AND (indid = @index_id)
-- 根據上面取出來的表名table_schema.table_name和索引的名稱index_name,還可以找出該索引是建立在哪些字段上的
EXEC sp_helpindex 'table_schema.table_name'
查看內存中緩存的執行計劃,以及執行計劃對應的語句:
-- 輸出可能較大,請小心使用
SELECT   usecounts, refcounts, size_in_bytes, cacheobjtype, objtype, text
FROM    sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_sql_text(plan_handle)  
ORDER BY objtype DESC


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区av影院萌芽| 亚洲精品视频免费| 欧美乱人伦中文字幕在线| wwwwwwww亚洲| 欧美激情欧美激情| 欧美激情性做爰免费视频| 91欧美视频网站| 亚洲精品福利资源站| 久久亚洲影音av资源网| 亚洲自拍偷拍第一页| 国内免费精品永久在线视频| 国产女人18毛片水18精品| 国产美女搞久久| 国产一区二区三区在线看| 国产精品久久91| 亚洲国产女人aaa毛片在线| 亚洲欧美中文日韩v在线观看| 亚洲综合最新在线| 国内精品美女av在线播放| 成人国产精品久久久| 国产精品中文在线| 欧美国产乱视频| 国产成人精品一区| 欧美性少妇18aaaa视频| 亚洲美女中文字幕| 欧美精品在线免费播放| 91亚洲永久免费精品| 色综合亚洲精品激情狠狠| 国产精品一区二区女厕厕| 欧美裸体男粗大视频在线观看| 91精品国产91| 欧美噜噜久久久xxx| 亚洲欧洲在线观看| 欧美日韩中文字幕在线视频| 亚洲女人天堂视频| 91美女片黄在线观看游戏| 国产精品麻豆va在线播放| 性欧美长视频免费观看不卡| 国产精品视频中文字幕91| 欧美精品video| 欧美成人精品h版在线观看| 国产成人激情小视频| 最近更新的2019中文字幕| 这里只有精品在线播放| 国产精品99久久久久久www| 日本一区二区三区四区视频| 在线播放国产精品| 中文字幕欧美在线| 亚洲男人天堂九九视频| 亚洲最大成人免费视频| 96sao精品视频在线观看| 久久人人爽人人爽人人片av高请| 亚洲人成在线观看网站高清| 成人黄色av播放免费| 精品国产乱码久久久久酒店| 亚洲一级免费视频| 色狠狠久久aa北条麻妃| 成人激情视频小说免费下载| 国产中文字幕日韩| 久久香蕉国产线看观看av| 热99久久精品| 国产成人精品久久二区二区91| 超碰97人人做人人爱少妇| 欧美视频在线观看免费| 国产精品一区久久| 国产视频福利一区| 欧美日韩国产91| 精品一区二区电影| 91精品国产综合久久香蕉最新版| 国产偷亚洲偷欧美偷精品| 欧美日韩国产成人在线| 欧美大学生性色视频| 91免费观看网站| 欧美大成色www永久网站婷| 国产精品稀缺呦系列在线| 日韩国产欧美精品一区二区三区| 欧美成年人在线观看| 中文字幕日韩欧美| 91精品视频在线| 亚洲国产成人久久综合| 国产成人欧美在线观看| 久久综合免费视频影院| 亚洲国模精品一区| 成人免费黄色网| 欧美最猛黑人xxxx黑人猛叫黄| www.欧美精品| 欧美精品在线极品| 亚洲区bt下载| 亚洲国产第一页| 在线观看欧美成人| 国内精品一区二区三区| 亚洲欧美国产制服动漫| 久久精品免费电影| 欧美人与性动交a欧美精品| 亚洲色图狂野欧美| 人体精品一二三区| 日韩精品在线视频美女| 隔壁老王国产在线精品| 久久久91精品| 2018中文字幕一区二区三区| 在线观看精品自拍私拍| 国产精品香蕉在线观看| 欧美午夜丰满在线18影院| 日韩一区二区av| 国产一区二区视频在线观看| 青草青草久热精品视频在线网站| 日韩欧美在线看| 国产精品视频一区二区高潮| 91高清视频免费观看| 日韩av在线精品| 亚洲久久久久久久久久| 成人www视频在线观看| 97精品国产97久久久久久春色| 国产精品一区专区欧美日韩| 欧美日韩加勒比精品一区| 日韩免费av片在线观看| 成人国内精品久久久久一区| 免费av在线一区| 国产精品色午夜在线观看| 91在线视频精品| 久久五月天综合| 久久久www成人免费精品张筱雨| 亚洲欧美日韩高清| 正在播放国产一区| 欧美小视频在线| 亚洲视频在线观看视频| 精品成人国产在线观看男人呻吟| 久久久久久久91| 精品成人久久av| 日韩精品在线观看视频| 91福利视频在线观看| 色爱av美腿丝袜综合粉嫩av| 欧美日韩另类字幕中文| 97视频在线播放| 欧美性色视频在线| 国产一区二区色| 成人免费看片视频| 日韩三级影视基地| 国产成人欧美在线观看| 成人网欧美在线视频| 国产精品高潮视频| 亚洲成人激情在线| 久久精品亚洲热| 91高清在线免费观看| 性亚洲最疯狂xxxx高清| 97国产一区二区精品久久呦| 中文字幕亚洲一区二区三区五十路| 亚洲xxx视频| 欧美性极品xxxx做受| 欧美极品少妇xxxxⅹ免费视频| 一区二区三区 在线观看视| 美日韩精品免费视频| 国产日韩中文字幕在线| 欧美黄色www| 欧美日韩免费一区| 清纯唯美亚洲激情| 色婷婷综合成人av| 久久久999精品视频| 久久久久久亚洲精品中文字幕| 久久成人免费视频| 日韩成人在线播放| 日韩中文字幕在线免费观看| 欧美极品少妇全裸体| 91精品国产高清久久久久久|