第七章——DMVs和DMFs(1)
簡(jiǎn)介:
??????? 從SQLServer2005開(kāi)始,微軟引入了一個(gè)名叫DMO(動(dòng)態(tài)管理對(duì)象)的新特性,DMO可以分為DMFs(Dynamic Manage Functions,動(dòng)態(tài)管理函數(shù))和DMVs(Dynamic Manage Views,動(dòng)態(tài)管理視圖)兩部分。這些函數(shù)和視圖用于查找SQLServer實(shí)例內(nèi)部統(tǒng)計(jì)信息以供性能監(jiān)控所用。它們提供實(shí)時(shí)的,關(guān)于SQLServer內(nèi)部工作的,能用于性能分析和性能故障排除的各種統(tǒng)計(jì)信息。
??????? 所有的DMO都屬于sys架構(gòu),并且以dm_開(kāi)頭。執(zhí)行DMO需要有VIEW SERVER STATE和VIEW DATABASE STATE權(quán)限。
?
下面簡(jiǎn)述一下本系列將要介紹的DMO:
?
?? 執(zhí)行相關(guān)的DMO(sys.dm_exec_*):提供與執(zhí)行相關(guān)的統(tǒng)計(jì)信息。可以用于監(jiān)控與緩存查詢、執(zhí)行計(jì)劃、活動(dòng)連接/會(huì)話和帶有執(zhí)行計(jì)劃的當(dāng)前運(yùn)行的查詢的相關(guān)統(tǒng)計(jì)信息。
?? 索引相關(guān)的DMO(sys.dm_db_index_*和sys.dm_db_missing_*):提供關(guān)于索引的統(tǒng)計(jì)信息。這些DMO可以用于監(jiān)控和分析因?yàn)閬G失索引、無(wú)效索引而導(dǎo)致的性能問(wèn)題,也可以用來(lái)檢查索引的使用情況。
?? 數(shù)據(jù)庫(kù)相關(guān)DMO(sys.dm_db_*):提供數(shù)據(jù)庫(kù)相關(guān)統(tǒng)計(jì)信息。可以用于監(jiān)控和分析數(shù)據(jù)庫(kù)的性能問(wèn)題,分析數(shù)據(jù)庫(kù)相關(guān)文件的統(tǒng)計(jì)信息、會(huì)話統(tǒng)計(jì)信息和任務(wù)統(tǒng)計(jì)信息。
?? I/O相關(guān)DMO(sys.dm_io_*):提供I/O操作的統(tǒng)計(jì)信息,用于監(jiān)控和分析SQLServer的I/O性能問(wèn)題。
?? OS相關(guān)DMO(sys.dm_os_*):提供關(guān)于sqlos內(nèi)部統(tǒng)計(jì)信息,用于監(jiān)控和分析服務(wù)器配置問(wèn)題。
?? 事務(wù)相關(guān)的DMO(sys.dm_trn_*):提供事務(wù)相關(guān)的統(tǒng)計(jì)信息,用于監(jiān)控和分析長(zhǎng)時(shí)間運(yùn)行的事務(wù)的鎖定、死鎖問(wèn)題。
?
這些DMO的數(shù)據(jù)可以通過(guò)DBCC SQLPERF(‘SYS.DM_OS_WAIT_STATS’,CLEAR)或者重啟服務(wù)器來(lái)重置。
?
?
監(jiān)控當(dāng)前查詢執(zhí)行的統(tǒng)計(jì)信息:
??????? 為了使得服務(wù)器上的查詢足夠的好,需要識(shí)別那些消耗資源的查詢和找到這些資源的來(lái)源。為了實(shí)現(xiàn)這些功能,需要監(jiān)控查詢的請(qǐng)求和檢查它們的運(yùn)行時(shí)間、IO操作等等。
??????? SQLServer有專用的DMO來(lái)監(jiān)控查詢的執(zhí)行信息,這些DMO包含廣泛的信息,以sys.dm_exec_開(kāi)頭。通過(guò)這些DMO可以快速發(fā)現(xiàn)問(wèn)題查詢,從而進(jìn)行優(yōu)化。
??????? 本文將演示使用DMO來(lái)獲取當(dāng)前正在請(qǐng)求SQLServer查詢的信息,并找到長(zhǎng)時(shí)間運(yùn)行的查詢,同時(shí)可以監(jiān)控當(dāng)前正在運(yùn)行的游標(biāo),這個(gè)通常也會(huì)引起性能問(wèn)題。
?
準(zhǔn)備工作:
??????? 本文中將使用DMO來(lái)監(jiān)控當(dāng)前查詢請(qǐng)求的一些有用信息,如數(shù)據(jù)庫(kù)名、登錄名、程序名、查詢開(kāi)始時(shí)間、讀寫(xiě)數(shù)。
??????? 眾所周知,游標(biāo)是非常消耗資源且影響查詢性能的,如非必要,不建議使用。
??????? 本例中使用SQLServer 2008R2,并在微軟示例數(shù)據(jù)庫(kù)AdventureWorks上操作。
?
步驟:
1、? 打開(kāi)SSMS,連到SQLServer實(shí)例。
2、? 打開(kāi)新查詢窗口,并輸入以下代碼,用于監(jiān)控當(dāng)前查詢:
?
SELECT DB_NAME(R.database_id) AS DatabaseName ,S.original_login_name AS LoginName ,S.host_name AS ClientMachine ,S.program_name AS ApplicationName ,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 RINNER JOIN sys.dm_exec_sessions AS S ON R.session_id = S.session_idCROSS APPLY sys.dm_exec_sql_text(R.sql_handle) AS STCROSS APPLY sys.dm_exec_query_plan(R.plan_handle) AS QP ORDER BY TotalTimeElapsed DESC GO
?
?
3、? 打開(kāi)新窗口輸入一下腳本,用于監(jiān)控當(dāng)前打開(kāi)的游標(biāo):
?
SELECT S.host_name AS ClientMachine ,S.program_name AS ApplicationName ,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 CINNER JOIN sys.dm_exec_sessions AS S ON C.session_id = S.session_idCROSS APPLY sys.dm_exec_sql_text(C.sql_handle) AS ST ORDER BY DurationInMiliSeconds DESC GO
?
?
分析:
在上面步驟中,使用了以下的DMOs:
?? Sys.dm_exec_requests
?? Sys.dm_exec_sessions
?? Sys.dm_exec_sql_text
?? Sys.dm_exec_query_plan
?
對(duì)于上面的查詢結(jié)果,需要思考的問(wèn)題:
?? 哪個(gè)庫(kù)正在接受請(qǐng)求?
?? 那個(gè)登錄名執(zhí)行了這個(gè)請(qǐng)求?
?? 請(qǐng)求是從哪個(gè)計(jì)算機(jī)發(fā)出的?
?? 請(qǐng)求是從那個(gè)應(yīng)用程序發(fā)出的?
?? 請(qǐng)求是何時(shí)到達(dá)SQLServer的?
?? 請(qǐng)求中需要執(zhí)行什么SQL語(yǔ)句?
?? 執(zhí)行的SQL語(yǔ)句的執(zhí)行計(jì)劃是什么?
?? 請(qǐng)求的持續(xù)時(shí)間有多少?
?? 請(qǐng)求是否開(kāi)啟了事務(wù)?
?? 請(qǐng)求造成的讀寫(xiě)數(shù)是多少?
?? 請(qǐng)求是否被阻塞了?如果是,是哪個(gè)會(huì)話造成的?
?
??????? 為了找到這些信息,需要把sys.dm_exec_requests和sys.dm_exec_sessions的session_id列關(guān)聯(lián)。
同時(shí),使用CROSS APPLY來(lái)關(guān)聯(lián)sys.dm_exec_sql_text()函數(shù)來(lái)查找請(qǐng)求的SQL文本。關(guān)聯(lián)sys.dm_exec_query_plan()函數(shù)來(lái)查找請(qǐng)求的執(zhí)行計(jì)劃。這兩個(gè)函數(shù)需要從查詢中分別獲得sql_handle和plan_handle。在結(jié)果集中,按TotalTimeElapsed列排序,可以知道最耗資源的查詢。
?
??????? 第二個(gè)查詢中使用了sys.dm_exec_cursors()函數(shù)來(lái)返回當(dāng)前正在使用的游標(biāo)的詳細(xì)。這個(gè)函數(shù)接受session_id作為參數(shù)。如果傳入了特定session_id,只會(huì)返回該會(huì)話的游標(biāo),如果傳入0,則返回所有會(huì)話的游標(biāo)。結(jié)果集按照DurationInMiliSecondes排序,一邊查找最耗資源的游標(biāo),注意worker_time除以了1000,因?yàn)檫@個(gè)的單位是微妙,除以1000可以得到毫秒。
?
擴(kuò)充知識(shí):
由于這些dmo的解釋較長(zhǎng),詳細(xì)請(qǐng)看聯(lián)機(jī)叢書(shū)。除了上面列出的dmo之外,還有一些與執(zhí)行相關(guān)的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提供查詢和對(duì)象的詳細(xì)緩存信息,對(duì)查詢優(yōu)化很有幫助。
posted on 2015-03-06 14:56 NET未來(lái)之路 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/4318256.html
總結(jié)
以上是生活随笔為你收集整理的第七章——DMVs和DMFs(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设置div滚动条
- 下一篇: C++标准:C++不允许修改任何基本型别