【转载】SQL Server中查询CPU占用高的SQL语句

本文导读:触发器造成死锁、作业多且频繁、中间表的大量使用、游标的大量使用、索引的设计不合理、事务操作频繁、SQL语句设计不合理,都会造成查询效率低下、影响服务器性能的发挥。我们可以使用sql server自带的性能分析追踪工具sql profiler分析数据库设计所产生问题的来源,进行有针对性的处理;下面介绍SQL Server中如何查询CPU占用高的SQL语句

SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests

一、查看当前的数据库用户连接有多少

USE master

GO

SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])=‘gposdb‘

SELECT COUNT(*) FROM [sys].[dm_exec_sessions] WHERE [session_id]>50

二、选取前10个最耗CPU时间的会话

SQL 代码   复制

SELECT TOP 10 

[session_id], 

[request_id], 

[start_time] AS ‘开始时间‘, 

[status] AS ‘状态‘, 

[command] AS ‘命令‘, 

dest.[text] AS ‘sql语句‘, 

DB_NAME([database_id]) AS ‘数据库名‘, 

[blocking_session_id] AS ‘正在阻塞其他会话的会话ID‘, 

[wait_type] AS ‘等待资源类型‘, 

[wait_time] AS ‘等待时间‘, 

[wait_resource] AS ‘等待的资源‘, 

[reads] AS ‘物理读次数‘, 

[writes] AS ‘写次数‘, 

[logical_reads] AS ‘逻辑读次数‘, 

[row_count] AS ‘返回结果行数‘ 

FROM sys.[dm_exec_requests] AS der 

CROSS APPLY 

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest 

WHERE [session_id]>50 AND DB_NAME(der.[database_id])=‘gposdb‘ 

ORDER BY [cpu_time] DESC 

三、查询前10个最耗CPU时间的SQL语句

SQL 代码   复制

--在SSMS里选择以文本格式显示结果 

SELECT TOP 10 

dest.[text] AS ‘sql语句‘ 

FROM sys.[dm_exec_requests] AS der 

CROSS APPLY 

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest 

WHERE [session_id]>50 

ORDER BY [cpu_time] DESC 

四、查询会话中有多少个worker在等待 

SQL 代码   复制

SELECT TOP 10 

 [session_id], 

 [request_id], 

 [start_time] AS ‘开始时间‘, 

 [status] AS ‘状态‘, 

 [command] AS ‘命令‘, 

 dest.[text] AS ‘sql语句‘, 

 DB_NAME([database_id]) AS ‘数据库名‘, 

 [blocking_session_id] AS ‘正在阻塞其他会话的会话ID‘, 

 der.[wait_type] AS ‘等待资源类型‘, 

 [wait_time] AS ‘等待时间‘, 

 [wait_resource] AS ‘等待的资源‘, 

 [dows].[waiting_tasks_count] AS ‘当前正在进行等待的任务数‘, 

 [reads] AS ‘物理读次数‘, 

 [writes] AS ‘写次数‘, 

 [logical_reads] AS ‘逻辑读次数‘, 

 [row_count] AS ‘返回结果行数‘ 

 FROM sys.[dm_exec_requests] AS der 

 INNER JOIN [sys].[dm_os_wait_stats] AS dows 

 ON der.[wait_type]=[dows].[wait_type] 

 CROSS APPLY 

 sys.[dm_exec_sql_text](der.[sql_handle]) AS dest 

 WHERE [session_id]>50 

 ORDER BY [cpu_time] DESC 

五、查询CPU占用高的语句

SQL 代码   复制

SELECT TOP 10 

 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 

时间: 2024-10-14 03:01:39

【转载】SQL Server中查询CPU占用高的SQL语句的相关文章

如何识别SQL Server中的CPU瓶颈

原文:如何识别SQL Server中的CPU瓶颈 原文出自: http://www.mssqltips.com/sqlservertip/2316/how-to-identify-sql-server-cpu-bottlenecks/ 问题: 如果经常遇到CPU瓶颈而导致的SQLServer宕机,那如何去发现并解决这些相关的问题? 解决方案: 导致CPU成为SQLServer性能问题的原因有很多,比较明显的原因是因为资源不足.但是,CPU的利用率可以通过配置的更改和查询的优化来降低,所以当你想买

在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题

原文:在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题 SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="D:\KK.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$] 问题: 消息 15281,级别 16,状态 1,第 1 行 SQL Server 阻止了对组件 'Ad Hoc Di

SQL Server中查询用户的对象权限和角色的方法

--SQL Server中查询用户的对象权限和角色的方法 -- 查询用户的object权限 exec sp_helprotect NULL, 'sa' -- 查询用户拥有的role exec sp_helpuser 'public' -- 查询哪些用户拥有指定的系统role exec sp_helpsrvrolemember 'sysadmin' -- 可查询嵌套role WITH tree_roles as ( SELECT role_principal_id, member_principa

【SQL Server数据迁移】64位的机器:SQL Server中查询ORACLE的数据

从SQL Server中查询ORACLE中的数据,可以在SQL Server中创建到ORACLE的链接服务器来实现的,但是根据32位 .64位的机器和软件,需要用不同的驱动程序来实现. 在64位的机器上,通过访问接口:OracleProvide for OLE DB,来实现. 1.机器环境和软件环境 操作系统是:windows 7旗舰版 64位,SQL Server 20008R2  64  位,Oracle 11g 11.2.0.1.0   64 位. 2.ORACLE环境的设置 连接orac

Sql Server中查询今天、昨天、本周、上周、本月、上月数据

在做Sql Server开发的时候有时需要获取表中今天.昨天.本周.上周.本月.上月等数据,这时候就需要使用DATEDIFF()函数及GetDate()函数了. DATEDIFF ( datepart , startdate , enddate ) 释义:计算时间差 datepare值:year | quarter | month | week | day | hour | minute | second | millisecond startdate:开始日期 enddate :结束日期 Ge

SQL SERVER中查询参数为空(null)时默认查询所有的实现

最近在项目中碰到一个比较有意思的问题,网上查找了一些方法,在这里总结分享一下. 我们经常会碰到这样的场景:需要查询数据,有一些查询条件,但是查询的时候,我们希望在某个条件为空的时候,则不筛选这个条件,处理的思路主要有这么几种: 1.程序收集查询查询条件的时候处理,这种适合动态SQL的,拼接SQL的时候根据参数是否为空来决定是否拼接对应的查询条件. 2.SQL中处理,这种情况适合存储过程,参数固定的场景,或者是非拼接where条件的场景,存储过程中一般没有使用拼接SQL的方式,那么如何实现参数为n

SQL Server中查询结果拼接遇到的小问题

前天的项目,刚接手,对于模块还不是很熟悉,其中有一个模块,涉及到4个表,其中主要的表就有两个,只要把这个弄清楚了就一切回归于"太平"了. 模块要求:把两个表的内容查询出来,结果连接在一起.大师说完,感觉没有什么问题,自己就看了下数据库表的设计,看完后,发现两张表中的主键完全可以相同啊! 项目不仅设计到读出来,还要根据主键把对应的所有数据都读出,这一下让我感觉很头疼,.想想以前老师曾说过,在万不得已的时候不要用UNION或者UNION ALL,这会大大降低性能的. 于是就和大师商量能不能

Sql Server 中查询存储过程的修改时间

1.按最近修改排序所有存储过程 SELECT [name], [create_date], [modify_date] FROM [sys].[objects] WHERE [type] = 'P' -- 这里也可以替换为:'U','IF','TR'分别代表用户表,自定义函数,触发器 ORDER BY [modify_date] DESC 2.查询指定存储过程的创建及修改时间 select [name] ,create_date ,modify_date FROM sys.all_objects

sql server中查询结果集顺序问题

因为优化器可能会选择并行处理,或者在多文件情况下不按“期待”顺序扫描数据,所以无法保证数据的顺序.唯一能确保顺序的只有order by. 并行处理的过程导致顺序不一致,单核上不存在并行,而双核,可能使用并行的机会及其少,多核的服务器上结果集顺序每次都可能不同. (转自 http://bbs.csdn.net/topics/390756833 不同网友观点)