近来看到别人的有关数据库查询cpu占用较高的sql语句(本人sql并不好),所以查询了一下资料,记录一下,便于理解和应用。

首先,将语句贴在这里

SELECT TOP 10
  --平均cpu时间
total_worker_time/execution_count AS avg_cpu_cost,
plan_handle,
execution_count,
(SELECT SUBSTRING(text, statement_start_offset/2 + 1,
(CASE WHEN statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), text)) * 2
ELSE statement_end_offset
END - statement_start_offset)/2)
FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
FROM sys.dm_exec_query_stats
ORDER BY [avg_cpu_cost] DESC
 

然后,讲解一下,我对于这段代码的理解

首先将语句分解,最内层的为:

首先 的意思:将text转化为字符串,然后获取长度。

然后case when else end的意思:

当 statement_end_offset = -1的时候,输出text的长度*2 ,如果不是,输出 statement_end_offset的大小,最终将输出的结果减去statement_start_offset,最终得到结果。/2,就不用说了,大家都懂的。其中的 text 是属于dm_exec_sql_text的,即最终的sql语句存储在这个变量中。

然后就是SUBSTRING()函数了。从截图中可以看出,Substring 的用法及其含义了,第一个参数是表达式,然后是截取开始的位置,然后是长度,这样就不难理解上面的语句了。

现在,就是这个模块了首先,需要知道 sys.dm_exec_sql_text(sql_handle) 是什么。

官方解释:  返回由指定的sql_handle标识的SQL批处理的文本。 也就是说,返回执行的sql语句。

那么,现在开始说 sys.dm_exec_query_stats 官方解释:返回缓存的查询计划中的聚合性能统计信息 sql server。缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。从缓存删除计划时,也将从该视图中删除对应行。 备注:若要从我们称之为Azure SQL数据仓库或并行数据仓库,使用名称 sys.dm_pdw_nodes_exec_query_stats。其中上面用到的参数 sql_handle,statement_start_offset,statement_end_offset 都是它产生的。

列名 数据类型 描述
sql_handle
varbinary(64)

表示包含查询的皮查询或存储过程的标记。

sql句柄以及statement_start_offset和语句结束偏移量,可以用于检索查询的sql文本通过调用sys.dm_exec_sql_text动态管理函数。

statement_start_offset int 指示行所说明的查询在其批查询或持久化对象文本中的开始位置(一字节为单位,从0开始)。
statement_end_offset int 指示行所说明的查询在其批查询或持久化对象文本中的结束位置(以字节为单位,从0开始)。之前的版本为sql server 2014,值为-1指示批处理的末尾。不再包括尾随的注释。
total_worker_time bigint 此计划自编译以来执行所用的cpu时间总量(以微妙为单位报告,但仅精确到毫秒)。
execution_count bigint 计划自上次编译以来所执行的次数。
plan_handle varbinary(64)

表示查询所属的已编译计划的标记。此值可以传递给sys.dm_exec_query_plan动态管理函数来获取查询计划。

当本机编译的存储过程查询内存优化的表时,此项将始终为0x000.

execution_count  bingint  此计划自编译以来所执行的次数。

参照上面表格的,我们不难理解初始的语句了。

但是,对于我自己来说,还是有许多的问题的:

第一个:为什么start需要/2+1
第二个:len()获取到长度为什么需要*2
第三个:最终的结果为什么要/2
第四个:plan_handle得到的结果如何解读

请教了别人,得到了答案加上我自己的理解,在此记录一下第四个的答案(前三个有待研究):

对于第四个问题,看一个这个文章基本就能够明白了:https://www.cnblogs.com/huangxincheng/p/4279870.html

数据库占用cpu较高的查询的更多相关文章

  1. 数据库占用CPU过高,性能分析与调优

    一.使用 dstat -tcdlmnsygr --disk-util 查看当前系统资源使用状况,当前cpu使用率100% 二.使用TOP命令 查看当前占用CPU进程,可以看到当前占用CPU进程最高的是 ...

  2. Mysql占用CPU过高如何优化?(转)

    原文:http://bbs.landingbj.com/t-0-241441-1.html MySQL处在高负载环境下,磁盘IO读写过多,肯定会占用很多资源,必然CP会U占用过高. 占用CPU过高,可 ...

  3. Mysql占用CPU过高如何优化,如何解决

    2017-02-28 15:13 331人阅读 评论(0) 收藏 举报   MySQL占用CPU过高如何优化 一次生产DB服务器的 超负荷运行问题解决: 1.查看生产DB服务器top列表, 执行 to ...

  4. SQL Server 占用CPU较高的解决方法

    触发原因:月底系统结账的时候对ERP的操作较多,有用户反馈系统之间的数据传输很久没有同步.随即到服务器上查看,没有发现有程序导致的问题,看了一下CPU的使用率,发现SQL Server占用率在百分之九 ...

  5. 服务器CPU又爆了?Linux快速排查Java程序占用CPU很高的方法

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 1.场 ...

  6. memcache占用CPU过高的解决办法

    Simon最近为公司服务器操碎了心 , 先是mysqld进程占用CPU过高 , 导致服务器性能变低 ,网站打开太慢.通过增加max_connections及table_cache解决了问题 ,随后发现 ...

  7. 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...

  8. w3wp占用CPU过高

    w3wp占用CPU过高 在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一 ...

  9. JVM进程占用CPU过高问题排查

    上午收到报警,某台机器上的CPU负载过高,通过逐步的排查,解决了问题,下面记录一下整个排查的过程. 首先,登录上对应的机器,通过top命令找到占用CPU过高的进程ID,也就是PID,为29126, 然 ...

随机推荐

  1. 初学html,任务2:写一个简单的登陆/注册界面

    先在body中把最基础的标签写出来 现在页面运行出来是这样的 就是一个没有任何样式的基础界面: 接下来我们为这些标签加上样式 首先还是让页面所有元素的padding和margin都设置为0, 清除浏览 ...

  2. Maximum Sum Circular Subarray LT918

    Given a circular array C of integers represented by A, find the maximum possible sum of a non-empty ...

  3. AX_ClassTemplate

    static void main(Args args) { THK_InterfaceDataExtract THK_InterfaceDataExtract; FormRun formRun = a ...

  4. 项目管理 - PM、 SRS、SOW简介及范例

    PM在一个IT项目中的主要管理任务 http://blog.csdn.net/eaglezhang/article/details/1717171 计算机软件需求说明编制指南 http://blog. ...

  5. java 排序算法

    1.冒泡排序 public static void main(String[] args) { int[] arr={6,3,8,2,9,1}; System.out.println("排序 ...

  6. P4149 [IOI2011]Race

    对于这道题,明显是点分治,权值等于k,可以用桶统计树上路径(但注意要清空); 对于每颗子树,先与之前的子树拼k,再更新桶,维护t["len"]最小边数; #include < ...

  7. Js高级程序设计~读书笔记

    1.函数-函数声明和函数表达式 解析器在向执行环境加载数据时,函数声明和函数表达式的对待不同. 解析器会率先执行函数声明,将会在任何使用到它的地方前加载, 而对于函数表达式,只会在执行到的时候去加载: ...

  8. JavaScript深拷贝

    1,JSON.parse(JSON.stringify(obj)) 使用JSON实现深拷贝必须要求对象是符合JSON安全的,不了解JSON安全的自行百度. 2,lodash/underscore  _ ...

  9. 组件内守卫beforeRouteEnter和beforeRouteLeave

    beforeRouteEnter用法和其他守卫差不多. 有个注意的地方就是beforeRouteEnter不能用this获取组件内收据. 在next()方法内存入vm这个参数,获取组件内数据. bef ...

  10. WebApi零碎总结

    1.如果Content-Type是application/json,而POST和PUT的参数是[FromBody] string value,那么如果curl -d的值是'{"Name&qu ...