日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

谁占用了我的Buffer Pool?

發布時間:2024/9/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谁占用了我的Buffer Pool? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


我在做SQL Server 7.0技術支持的時候有客戶問我,“我的SQL Server buffer pool很大,有辦法知道是哪些對象吃掉我的buffer Pool內存么?比方說,能否知道是哪個數據庫,哪個表,哪個index占用了buffer Pool么?”當時我沒有找到這個問題的答案,但是我一直記著這個問題。直到SQL server 2005 版本出現,這個問題迎刃而解。答案就是使用動態視圖(DMV sys.dm_os_buffer_descriptors。

這個DMV非常強大。根據SQL Server 聯機叢書,這個視圖的作用是 “返回有關 SQL Server 緩沖池中當前所有數據頁的信息。可以使用該視圖的輸出,根據數據庫、對象或類型來確定緩沖池內數據庫頁的分布”。具體點說,這個視圖能夠返回buffer pool里面一個8K data page的下列屬性:

(1)該頁屬于哪個數據庫

(2)該頁屬于數據庫哪個文件

(3)該頁的Page_ID

(4)該頁的類型。可以根據這個來判斷此頁時索引頁還是數據頁

(5)該頁內有多少行數據

(6)該頁有多少可用空間。

(7)該頁從磁盤讀取以來是否修改過。

有了上面的信息,我們就可以很方便的統計出幾種很有用的數據,如下。

1.?????? Buffer Pool的內存主要是由那個數據庫占了?

SELECT count(*)*8? as cached_pages_kb,CASE database_id

??????? WHEN 32767 THEN ‘ResourceDb’

??????? ELSE db_name(database_id)

??????? END AS Database_name

FROM sys.dm_os_buffer_descriptors

GROUP BY db_name(database_id) ,database_id

ORDER BY cached_pages_kb DESC;

結果如下:

從上面的結果可以看到數據庫AdventureWorks占用了大概30MB左右的緩沖池空間。

注意該DMV 并不返回Buffer Pool里面有關非數據頁(如執行計劃的緩存等)的信息。也就是說這個DMV并沒有返回Buffer Pool里面所有頁面的信息。

2.?????? 再具體一點,當前數據庫的哪個表或者索引占用Pool緩沖空間最多?

SELECT count(*)*8 AS cached_pages_kb

??? ,obj.name ,obj.index_id,b.type_desc,b.name

FROM sys.dm_os_buffer_descriptors AS bd

??? INNER JOIN

??? (

??????? SELECT object_name(object_id) AS name

??????????? ,index_id ,allocation_unit_id,object_id

??????? FROM sys.allocation_units AS au

??????????? INNER JOIN sys.partitions AS p

??????????????? ON au.container_id = p.hobt_id

??????????????????? AND (au.type = 1 OR au.type = 3)

??????? UNION ALL

??????? SELECT object_name(object_id) AS name??

??????????? ,index_id, allocation_unit_id,object_id

??????? FROM sys.allocation_units AS au

??????????? INNER JOIN sys.partitions AS p

??????????????? ON au.container_id = p.partition_id

??????????????????? AND au.type = 2

??? ) AS obj

??????? ON bd.allocation_unit_id = obj.allocation_unit_id

??????? LEFT JOIN sys.indexes b on b.object_id = obj.object_id AND b.index_id = obj.index_id

?

WHERE database_id = db_id()

GROUP BY obj.name, obj.index_id ,b.name,b.type_desc

ORDER BY cached_pages_kb DESC;

輸出結果如下 (部分):

??

從上面的結果可以看到表Individual Pool內存里面緩沖最多,可能這個就是經常訪問的熱表,或者是比較大的表。注意Pool里面的緩沖頁是經常變化的。 你如果再跑一次語句,出現在頭條的可能是另外一個表了。

3.?????? Buffer Pool緩沖池里面修改過的頁總數大小。這個比較容易:

SELECT count(*)*8? as cached_pages_kb,

?????? convert(varchar(5),convert(decimal(5,2),(1001.0*(select count(*) from sys.dm_os_buffer_descriptors b where b.database_id=a.database_id and is_modified=0)/count(*)*100.0)))+‘%’ modified_percentage

??????? ,CASE database_id

??????? WHEN 32767 THEN ‘ResourceDb’

??????? ELSE db_name(database_id)

??????? END AS Database_name

FROM sys.dm_os_buffer_descriptors a

GROUP BY db_name(database_id) ,database_id

ORDER BY cached_pages_kb DESC;

結果:

?

從上面的結果可以看到,AdventureWorks數據庫大概有13.84%的數據是修改過的。如果一個數據庫的大部分(超過80% 是修改過的,那么這個數據庫寫操作非常多。反之如果這個比例接近0,那么該數據庫的活動幾乎是只讀的。讀寫的比例對磁盤的安排是很重要的。當然還有其他性能數據來獲得數據庫讀寫的大概比例,這里限于篇幅就不多談了。

總結

以上是生活随笔為你收集整理的谁占用了我的Buffer Pool?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。