原文:
第七章——dmvs和dmfs(1)
從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)
從sqlserver2005開始,微軟引入了乙個名叫dmo 動態管理物件 的新特性,dmo可以分為dmfs dynamic manage functions,動態管理函式 和dmvs dynamic manage views,動態管理檢視 兩部分。這些函式和檢視用於查詢sqlserver例項內部統計...
第七章 DMVs和DMFs(1)
原文 第七章 dmvs和dmfs 1 從sqlserver2005開始,微軟引入了乙個名叫dmo 動態管理物件 的新特性,dmo可以分為dmfs dynamic manage functions,動態管理函式 和dmvs dynamic manage views,動態管理檢視 兩部分。這些函式和檢視...
python第七章 python教程(第七章)
字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...