DBA的神兵利器——DMVs and DMFs

2024-04-13 04:38
文章标签 利器 dba 神兵 dmvs dmfs

本文主要是介绍DBA的神兵利器——DMVs and DMFs,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在SQL Server 2000的时候,我们要想做Performance Tuning的时候,多半都必须用到Profiler或者SQL Tracer来跟踪,这东西一是结果分析起来麻烦,二是对系统资源消耗太大。在SQL Server 2005中,提供了动态管理视图和函数(Dynamic Management Views and Dynamic Management Functions),大大的方便了我们对系统运行情况的监控,故障诊断和性能优化。现在除了Debug以外,已经很少再对生产系统使用Profiler。顺便说一下,SQL Server 2008有一个更好,更强大的Data Collector,可以收集系统信息放入数据仓库,再进行分析的,那时候DBA就更方便了。

下面我会Step by step的介绍,如何使用DMV和DMF来诊断系统情况,介绍到的全部知识都来自于联机丛书(Books Online)。

 

Issue:在新上线一个系统后,我发现数据库服务器的CPU有所升高,达到20-30%,Peak time的时候甚至会达到50%。于是我打开性能监视器,发现SQL Logins/sec平均超过2000。那么,我希望知道,是哪些SQL语句调用次数如此频繁,找到了这些SQL语句之后,就可以进行有针对的优化。

Step1:首先我们看看有什么DMV是适用的。在联机丛书的索引中输入动态管理视图 [SQL Server],发现下面有个链接与执行有关的动态管理视图和函数,这里面有一个视图叫sys.dm_exec_query_stats,顾名思义,应该是对执行查询的统计信息。

Step2:看看sys.dm_exec_query_stats的描述和字段,这个对象是返回缓存查询计划的聚合性能统计信息。包含的字段有execution_count,表示计划自上次编译以来所执行的次数。OK,就是它了。

Step3:怎么用这个视图呢?那些列好复杂,一时没有头绪,往下找找看。有了!下面有个示例,按平均 CLR 时间返回有关前五个查询的信息。

SELECT TOP 5 creation_time, last_execution_time, total_clr_time,

    total_clr_time/execution_count AS [Avg CLR Time], last_clr_time,

    execution_count,

    SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,

    ((CASE statement_end_offset

        WHEN -1 THEN DATALENGTH(st.text)

        ELSE qs.statement_end_offset END

            - qs.statement_start_offset)/2) + 1) as statement_text

FROM sys.dm_exec_query_stats as qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as st

ORDER BY total_clr_time/execution_count DESC;

GO

 

写不出来我总会改吧,照葫芦画瓢可轻松多了。

Step4: 我要做的是把排序条件的平均CLR时间改成平均每秒执行次数。看了一下字段列表,发现3个字段是有用的。creation_time 编译计划的时间。last_execution_time  上次执行计划的时间。execution_count 计划自上次编译以来所执行的次数。我考虑用(last_execution_time - creation_time ) /execution_count来得到平均每秒执行次数。修改后的SQL语句如下

SELECT TOP 5 creation_time, last_execution_time, 

execution_count / datediff(second, creation_time, last_execution_time) AS [Execute Count Per Second],

    execution_count,

    SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,

    ((CASE statement_end_offset

        WHEN -1 THEN DATALENGTH(st.text)

        ELSE qs.statement_end_offset END

            - qs.statement_start_offset)/2) + 1) as statement_text

FROM sys.dm_exec_query_stats as qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as st

ORDER BY  execution_count / datediff(second, creation_time, last_execution_time) DESC;

 

Step5:执行后发现有点小问题,出现错误信息

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

错误信息说被零除,那么是有datediff(second, creation_time, last_execution_time)等于0的。OK,我们加点条件,标准的做法是判断datediff(second, creation_time, last_execution_time)

>0,我判断execution_count > 100,在这个地方也能够达到同样的效果。修改的结果如下:

SELECT TOP 5 creation_time, last_execution_time, 

execution_count / datediff(second, creation_time, last_execution_time) AS [Execute Count Per Second],

    execution_count,

    SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,

    ((CASE statement_end_offset

        WHEN -1 THEN DATALENGTH(st.text)

        ELSE qs.statement_end_offset END

            - qs.statement_start_offset)/2) + 1) as statement_text

FROM sys.dm_exec_query_stats as qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as st

WHERE execution_count > 100

ORDER BY  execution_count / datediff(second, creation_time, last_execution_time) DESC;

Step 6:再调整一下所需的字段,我对creation_time, last_execution_time其实没啥兴趣,我更关心这个SQL语句执行的时间,I/O方面的信息,看了下字段列表,有total_physical_reads 此计划自编译后在执行期间所执行的物理读取总次数,total_elapsed_time 完成此计划的执行所占用的总时间(微秒)。再除以execution_count就是平均值了。修改后的SQL语句如下:

SELECT     TOP 100 execution_count / datediff(second, creation_time, last_execution_time) AS [Execute Times Per Second], execution_count,

total_logical_reads  /execution_count AS [Avg Logical Reads],

total_elapsed_time /execution_count AS [Avg Elapsed Time],

SUBSTRING(st.text, (qs.statement_start_offset / 2) + 1, ((CASE statement_end_offset WHEN - 1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset) / 2) + 1) AS statement_text

FROM         sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st

WHERE     execution_count > 100

ORDER BY 1 DESC;

 

Step7:OK,差不多能满足我的需求了,但是美中不足的是,我们对数据库的访问全是通过存储过程来实现的,要找到这段SQL语句出自哪个存储过程,虽然不是很麻烦,但是还是要动点手脚的,要是能在这个查询中显示出来就好了。 这个查询中用到了sys.dm_exec_sql_text,看看这里面有啥内容。在联机丛书的索引中输入sys.dm_exec_sql_text。Bingo!对于诸如存储过程、触发器或函数之类的数据库对象,SQL 句柄派生自数据库 ID、对象 ID 和对象编号。太好了,要的就是这个,有了ID就可以转换成名字了,object_name函数是早已熟悉的。最终的结果如下

SELECT     TOP 100 execution_count / datediff(second, creation_time, last_execution_time) AS [Execute Count Per Second], execution_count,

total_logical_reads  /execution_count AS [Avg Logical Reads],

total_elapsed_time /execution_count AS [Avg Elapsed Time],

db_name(st.dbid) as [database name],

object_name(st.objectid, st.dbid) as [object name],

SUBSTRING(st.text, (qs.statement_start_offset / 2) + 1, ((CASE statement_end_offset WHEN - 1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset) / 2) + 1) AS statement_text

FROM         sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st

WHERE     execution_count > 100

ORDER BY 1 DESC;

在实际应用的时候,再根据情况稍做修改即可。希望各位读者从这篇文章学到的不仅是sys.dm_exec_query_stats ,更重要的是了解到使用Books Online的方法。

谢谢阅读!

这篇关于DBA的神兵利器——DMVs and DMFs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899161

相关文章

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

GraphPad Prism 10 for Mac/Win:高效统计分析与精美绘图的科学利器

GraphPad Prism 10 是一款专为科研工作者设计的强大统计分析与绘图软件,无论是Mac还是Windows用户,都能享受到其带来的便捷与高效。该软件广泛应用于生物医学研究、实验设计和数据分析领域,以其直观的操作界面、丰富的统计方法和多样化的图表样式,成为科学研究的得力助手。 数据处理与整理 GraphPad Prism 10 支持从多种数据源导入数据,如Excel、CSV文件及数据库

Axure元件库Ant Design中后台原型模板:提升设计与开发效率的利器

企业对于中后台产品的设计与开发需求日益增长。为了提升用户体验和开发效率,设计者和开发者们不断寻求更加高效、统一的解决方案。Ant Design,作为阿里巴巴开源的一套企业级UI设计语言和React组件库,凭借其丰富的组件和统一的设计风格,已成为众多项目的首选。而在Axure中使用Ant Design元件库,更是为中后台产品的原型设计带来了极大的便利。 Ant Design简介 Ant D

【Linux】Linux 管道:进程间通信的利器

文章目录 Linux 管道:进程间通信的利器1. 什么是管道?2. 管道的分类2.1 匿名管道(Unnamed Pipe)2.2 命名管道(Named Pipe,FIFO) 3. 管道的局限性4. 结论 Linux 管道:进程间通信的利器 在 Linux 系统中,管道(Pipe)是进程间通信(IPC, Inter-Process Communication)的重要机制之一。

保研 比赛 利器: 用AI比赛助手降维打击数学建模

数学建模作为一个热门但又具有挑战性的赛道,在保研、学分加分、简历增色等方面具有独特优势。近年来,随着AI技术的发展,特别是像GPT-4模型的应用,数学建模的比赛变得不再那么“艰深”。通过利用AI比赛助手,不仅可以大大提升团队效率,还能有效提高比赛获奖几率。本文将详细介绍如何通过AI比赛助手完成数学建模比赛,并结合实例展示其强大功能。 一、AI比赛助手的引入 1. 什么是AI比赛助手? AI比

SpringCloud:构建分布式系统的利器

引言 随着云计算和微服务架构的兴起,传统的单体应用已经难以满足现代应用的高并发、高可用、可扩展等需求。SpringCloud,作为Spring生态中的微服务架构开发工具,通过提供一系列组件和框架,帮助开发者快速构建分布式系统。本文将详细介绍SpringCloud的概念、核心组件、以及如何使用SpringCloud来搭建一个简单的微服务应用。 SpringCloud简介 SpringCloud

【机器学习 模型调参】GridSearchCV模型调参利器

导入模块sklearn.model_selection from sklearn.model_selection import GridSearchCV GridSearchCV 称为网格搜索交叉验证调参,它通过遍历传入的参数的所有排列组合,通过交叉验证的方式,返回所有参数组合下的评价指标得分,GridSearchCV 函数的参数详细解释如下: class sklearn.model_se

【爬虫神器 pyppeteer】比 selenium 更高效的爬虫利器--pyppeteer

Puppeteer 是 Google 基于 Node.js 开发的工具,调用 Chrome 的 API,通过 JavaScript 代码来操纵 Chrome 完成一些操作,用于网络爬虫、Web 程序自动测试等。pyppeteer 使用了 Python 异步协程库 asyncio,可整合 Scrapy 进行分布式爬虫。要注意的是它执行python3.6+以后版本使用,下面我们一起来了解下如何使用。

Tushare库:Python金融数据分析的利器

文章目录 Tushare库:Python金融数据分析的利器一、引言二、Tushare库的安装与基础应用1、安装Tushare2、基础用法1.1 导入Tushare库1.2 获取数据 三、深入应用:案例分析1、股票收益策略模拟1.1 数据获取与处理1.2 策略模拟 四、总结 Tushare库:Python金融数据分析的利器 一、引言 在金融数据分析领域,Python因其强大