第七章 DMVs和DMFs(1)

2021-08-27 09:58:39 字數 3667 閱讀 7673

從sqlserver2005開始,微軟引入了乙個名叫dmo(動態管理物件)的新特性,dmo可以分為dmfs(dynamic manage functions,動態管理函式)和dmvs(dynamic manage views,動態管理檢視)兩部分。這些函式和檢視用於查詢sqlserver例項內部統計資訊以供效能監控所用。它們提供實時的,關於sqlserver內部工作的,能用於效能分析和效能故障排除的各種統計資訊。

所有的dmo都屬於sys架構,並且以dm_開頭。執行dmo需要有view server state和view database state許可權。

下面簡述一下本系列將要介紹的dmo:

ø 執行相關的dmo(sys.dm_exec_*):提供與執行相關的統計資訊。可以用於監控與快取查詢、執行計畫、活動連線/會話和帶有執行計畫的當前執行的查詢的相關統計資訊。

ø 索引相關的dmo(sys.dm_db_index_*和sys.dm_db_missing_*):提供關於索引的統計資訊。這些dmo可以用於監控和分析因為丟失索引、無效索引而導致的效能問題,也可以用來檢查索引的使用情況。

ø 資料庫相關dmo(sys.dm_db_*):提供資料庫相關統計資訊。可以用於監控和分析資料庫的效能問題,分析資料庫相關檔案的統計資訊、會話統計資訊和任務統計資訊。

ø i/o相關dmo(sys.dm_io_*):提供i/o操作的統計資訊,用於監控和分析sqlserver的i/o效能問題。

ø os相關dmo(sys.dm_os_*):提供關於sqlos內部統計資訊,用於監控和分析伺服器配置問題。

ø 事務相關的dmo(sys.dm_trn_*):提供事務相關的統計資訊,用於監控和分析長時間執行的事務的鎖定、死鎖問題。

這些dmo的資料可以通過dbcc sqlperf(『sys.dm_os_wait_stats』,clear)或者重啟伺服器來重置。

為了使得伺服器上的查詢足夠的好,需要識別那些消耗資源的查詢和找到這些資源的**。為了實現這些功能,需要監控查詢的請求和檢查它們的執行時間、io操作等等。

sqlserver有專用的dmo來監控查詢的執行資訊,這些dmo包含廣泛的資訊,以sys.dm_exec_開頭。通過這些dmo可以快速發現問題查詢,從而進行優化。

本文將演示使用dmo來獲取當前正在請求sqlserver查詢的資訊,並找到長時間執行的查詢,同時可以監控當前正在執行的游標,這個通常也會引起效能問題。

本文中將使用dmo來監控當前查詢請求的一些有用資訊,如資料庫名、登入名、程式名、查詢開始時間、讀寫數。

眾所周知,游標是非常消耗資源且影響查詢效能的,如非必要,不建議使用。

本例中使用sqlserver 2008r2,並在微軟示例資料庫adventureworks上操作。 1、

開啟ssms,連到sqlserver例項。 2、

開啟新查詢視窗,並輸入以下**,用於監控當前查詢:

select  db_name(r.database_id) as databasename ,

s.original_login_name as loginname ,

s.host_name as clientmachine ,

r.start_time as requeststarttime ,

st.text as sqlquery ,

qp.query_plan as executionplan ,

r.cpu_time as cputime ,

r.total_elapsed_time as totaltimeelapsed ,

r.open_transaction_count as totaltransactionopened ,

r.reads ,

r.logical_reads ,

r.writes as totalwrites

from sys.dm_exec_requests as r

inner join sys.dm_exec_sessions as s on r.session_id = s.session_id

order by totaltimeelapsed desc

go

3、

開啟新視窗輸入一下指令碼,用於監控當前開啟的游標:

select  s.host_name as clientmachine ,

s.original_login_name as loginname ,

c.name as cursorname ,

c.properties as cursoroptions ,

c.creation_time as cursorcreatintime ,

st.text as sqlquery ,

c.is_open as iscursoropen ,

c.worker_time / 1000 as durationinmiliseconds ,

c.reads as numberofreads ,

c.writes as numberofwrites

from sys.dm_exec_cursors (0) as c

inner join sys.dm_exec_sessions as s on c.session_id = s.session_id

order by durationinmiliseconds desc

go

在上面步驟中,使用了以下的dmos: ø

sys.dm_exec_requests ø

sys.dm_exec_sessions ø

sys.dm_exec_sql_text ø

sys.dm_exec_query_plan

對於上面的查詢結果,需要思考的問題: ø

哪個庫正在接受請求? ø

那個登入名執行了這個請求? ø

請求是從哪個計算機發出的? ø

請求是從那個應用程式發出的? ø

請求是何時到達sqlserver的? ø

請求中需要執行什麼sql語句? ø

執行的sql語句的執行計畫是什麼? ø

請求的持續時間有多少? ø

請求是否開啟了事務? ø

請求造成的讀寫數是多少? ø

請求是否被阻塞了?如果是,是哪個會話造成的?

為了找到這些資訊,需要把sys.dm_exec_requests和sys.dm_exec_sessions的session_id列關聯。

第二個查詢中使用了sys.dm_exec_cursors()函式來返回當前正在使用的游標的詳細。這個函式接受session_id作為引數。如果傳入了特定session_id,只會返回該會話的游標,如果傳入0,則返回所有會話的游標。結果集按照durationinmilisecondes排序,一邊查詢最耗資源的游標,注意worker_time除以了1000,因為這個的單位是微妙,除以1000可以得到毫秒。

由於這些dmo的解釋較長,詳細請看聯機叢書。除了上面列出的dmo之外,還有一些與執行相關的dmo,如: ø

sys.dm_exec_cached_plans(dmv) ø

sys.dm_exec_procedure_stats(dmv) ø

sys.dm_exec_query_stats(dmv) ø

sys.dm_exec_cached_plan_dependent_objects(dmf)

這些dmo提供查詢和物件的詳細快取資訊,對查詢優化很有幫助。

第七章 DMVs和DMFs(1)

原文 第七章 dmvs和dmfs 1 從sqlserver2005開始,微軟引入了乙個名叫dmo 動態管理物件 的新特性,dmo可以分為dmfs dynamic manage functions,動態管理函式 和dmvs dynamic manage views,動態管理檢視 兩部分。這些函式和檢視...

第七章 DMVs和DMFs(1)

原文 第七章 dmvs和dmfs 1 從sqlserver2005開始,微軟引入了乙個名叫dmo 動態管理物件 的新特性,dmo可以分為dmfs dynamic manage functions,動態管理函式 和dmvs dynamic manage views,動態管理檢視 兩部分。這些函式和檢視...

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...