原文:第七章——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 ,
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 R
INNER JOIN sys.dm_exec_sessions AS S ON R.session_id = S.session_id
CROSS APPLY sys.dm_exec_sql_text(R.sql_handle) AS ST
CROSS APPLY sys.dm_exec_query_plan(R.plan_handle) AS QP
ORDER BY TotalTimeElapsed DESC
GO

3、 
打开新窗口输入一下脚本,用于监控当前打开的游标:

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 C
INNER JOIN sys.dm_exec_sessions AS S ON C.session_id = S.session_id
CROSS 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

对于上面的查询结果,需要思考的问题:

Ø  哪个库正在接受请求?

Ø  那个登录名执行了这个请求?

Ø  请求是从哪个计算机发出的?

Ø  请求是从那个应用程序发出的?

Ø  请求是何时到达SQLServer的?

Ø  请求中需要执行什么SQL语句?

Ø  执行的SQL语句的执行计划是什么?

Ø  请求的持续时间有多少?

Ø  请求是否开启了事务?

Ø  请求造成的读写数是多少?

Ø  请求是否被阻塞了?如果是,是哪个会话造成的?

为了找到这些信息,需要把sys.dm_exec_requests和sys.dm_exec_sessions的session_id列关联。

同时,使用CROSS APPLY来关联sys.dm_exec_sql_text()函数来查找请求的SQL文本。关联sys.dm_exec_query_plan()函数来查找请求的执行计划。这两个函数需要从查询中分别获得sql_handle和plan_handle。在结果集中,按TotalTimeElapsed列排序,可以知道最耗资源的查询。

第二个查询中使用了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)的更多相关文章

  1. 第七章——DMVs和DMFs(4)——用DMV和DMF监控磁盘IO

    原文:第七章--DMVs和DMFs(4)--用DMV和DMF监控磁盘IO 前言: 本文为本系列最后一篇,作为DBA,你必须经常关注磁盘的I/O问题,一旦出现问题,要尽快分析出是什么问题.SQLServ ...

  2. 第七章——DMVs和DMFs(3)——用DMV和DMF监控TempDB

    原文:第七章--DMVs和DMFs(3)--用DMV和DMF监控TempDB 前言: 我们都知道TempDB是SQLServer的系统数据库,且SQLServer的日常运作严重依赖这个库.因此,监控T ...

  3. 第七章——DMVs和DMFs(2)——用DMV和DMF监控索引性能

    原文:第七章--DMVs和DMFs(2)--用DMV和DMF监控索引性能 本文继续介绍使用DMO来监控,这次讲述的是监控索引性能.索引是提高查询性能的关键性手段.即使你的表上有合适的索引,你也要时时刻 ...

  4. 精通Web Analytics 2.0 (9) 第七章:失败更快:爆发测试与实验的能量

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第七章:失败更快:爆发测试与实验的能量 欢迎来到实验和测试这个棒极了的世界! 如果Web拥有一个超越所有其他渠道的巨大优势,它就 ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7  标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...

  7. Java语言程序设计(基础篇) 第七章 一维数组

    第七章 一维数组 7.2 数组的基础知识 1.一旦数组被创建,它的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 2.数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储 ...

  8. objective-c第七章课后练习2

    题:改变第七章例子中print方法,增加bool参数,判断如果是YES则对分数进行约简 @interface Fraction : NSObject { //int num,den; } @prope ...

  9. 读《编写可维护的JavaScript》第七章总结

      第七章 事件处理 7.1 典型用法 作者首先给了个我们一个处理事件的方法.看起来也没啥俩样,不过后来给出的优化方法很值得学习: // 不好的写法 function handleClick(even ...

随机推荐

  1. Linux查看用户数、登录用户

    如果是系统中全部只要默认shell是bash的就包括那么二楼正解,就是cat /etc/passwd|grep bash|wc -l如果是正在登陆系统的账户中使用bash shell的,那么ps -e ...

  2. Android的目录结构说明

  3. [C++基金会]位计算 游戏开发中的应用

    定义的位操作:通俗点说,,位计算是计算机操作二进制整数. 无论整数可以用二的方式来表示进度,不同类型的其长度的整数位的是不一样的.INT8要么char靠8个月2 位表示,INT16或者short是由1 ...

  4. 金色的 SQL注意事项(1)

    page(1-75) 最好是没有意义的主键字段,以方便未来的扩展. PS:主键,以后标书编码填错须要改的时候,关联表都须要跟着改.假设是一个无意义的自增字段是主键就无此原因. 主键最好不要设置为联合主 ...

  5. python学习笔记之11:图像用户界面

    这里会介绍如何创建python程序的图像用户界面(GUI),也就是那些带有按钮和文本框的窗口等.目前支持python的所谓“GUI工具包”的有很多,本文简要介绍最成熟的跨平台pythonGUI工具包- ...

  6. 学习笔记 Android.mk 搜索自己主动

    最近一直Android.mk这是什么一个令人沮丧的夜晚,点击此处记录. ios你担心更多.不管那么多.xcode自己解决. 文本工具:MACVIM(文本编辑工具 很有用 你可以清楚地分辨tab 和Sp ...

  7. (hdu 7.1.8)Quoit Design(最低点——在n一个点,发现两点之间的最小距离)

    主题: Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...

  8. Ubuntu下超实用的命令

    1. Ubuntu中查看已安装软件包的方法 sudodpkg -l 2. ubuntu系统如何查看软件安装的位置 dpkg-L软件名 实例: wwx@ubuntu:~$dpkg -L mysql-se ...

  9. 玩转web之JQuery(二)---改变表单和input的可编辑状态(封装的js)

    var FormDeal = { /** * 功能 :将表单的所有input都设为可编辑的 *@param 要操作表单的id */ formWritable: function (formId) { ...

  10. Hibernate Tomcat JNDI数据源配置(转)

    简述: 配置JNDI 查找Tomcat 中server.xml中定义的数据源 步骤: 1. 修改elipse的数据源server.xml 主要修改如下, 1. 添加下面这段Context文本 其中St ...