【SQL Server DBA】日常巡检语句3:特定监控(阻塞、top语句、索引、作业)
原文:【SQL Server DBA】日常巡检语句3:特定监控(阻塞、top语句、索引、作业)
                          
1、查询阻塞信息、锁定了哪些资源
- 
--1.查看阻塞信息
- 
select spid,loginame,waitresource from master..sysprocesses 
- 
where blocked <> 0
- 
/*
- 
spid	loginame	waitresource
- 
53	ggg-PC\Administrator RID:1:1:1385:0
- 
*/
- 
 
- 
 
- 
 
- 
--2.查看语句
- 
dbcc inputbuffer(53)
- 
/*
- 
eventInfo
- 
select * from xx
- 
*/
- 
 
- 
 
- 
 
- 
--3.查看锁的信息
- 
exec sp_lock @spid1 = 53
- 
/*
- 
spid	dbid	ObjId	IndId	Type	Resource	Mode	Status
- 
53	1	1335727861	0	PAG	1:1385                          	IS	GRANT
- 
53	1	1335727861	0	RID	1:1385:0                        	S	WAIT
- 
53	1	1335727861	0	TAB	                                	IS	GRANT
- 
*/
- 
 
- 
--select OBJECT_ID(1335727861) as table_name
- 
 
- 
 
- 
 
- 
--4.打开数据库
- 
select *
- 
from sysdatabases
- 
where dbid = 1
- 
/*
- 
name	dbid	sid	mode	status	status2	crdate	reserved	category	cmptlevel	filename	version
- 
master	1	0x01	0	65544	1090520064	2003-04-08 09:13:36.390	1900-01-01 00:00:00.000	0	100	C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\master.mdf	661
- 
*/
- 
 
- 
 
- 
 
- 
--5.根据锁信息中的ObjId列:1335727861,找到了这个xx表
- 
select *
- 
from sysobjects
- 
where id = 1335727861
- 
/*
- 
name	id	xtype	uid	info	status	base_schema_ver	replinfo	parent_obj	crdate	ftcatid	schema_ver	stats_schema_ver	type	userstat	sysstat	indexdel	refdate	version	deltrig	instrig	updtrig	seltrig	category	cache
- 
xx	1335727861	U 	1	0	0	0	0	0	2013-12-25 08:55:07.523	0	0	0	U 	1	3	0	2013-12-25 08:55:07.523	0	0	0	0	0	0	0
- 
*/
查找死锁
- 
exec sp_who_lock  
- 
/*  
- 
create procedure sp_who_lock    
- 
as    
- 
begin    
- 
    declare @spid int,@bl int,    
- 
    @intTransactionCountOnEntry int,    
- 
    @intRowcount int,    
- 
    @intCountProperties int,    
- 
    @intCounter int    
- 
    create table #tmp_lock_who (id int identity(1,1),spid smallint,bl smallint)    
- 
    IF @@ERROR<>0 RETURN @@ERROR    
- 
    insert into #tmp_lock_who(spid,bl) select 0 ,blocked    
- 
    from (select * from sys.sysprocesses where blocked>0 ) a     
- 
    where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b     
- 
    where a.blocked=spid)    
- 
    union select spid,blocked from sys.sysprocesses where blocked>0    
- 
    IF @@ERROR<>0 RETURN @@ERROR    
- 
        -- 找到临时表的记录数    
- 
        select @intCountProperties = Count(*),@intCounter = 1    
- 
        from #tmp_lock_who    
- 
    IF @@ERROR<>0 RETURN @@ERROR    
- 
    if @intCountProperties=0    
- 
    select '现在没有阻塞和死锁信息' as message    
- 
    -- 循环开始    
- 
    while @intCounter <= @intCountProperties    
- 
    begin    
- 
    -- 取第一条记录    
- 
    select @spid = spid,@bl = bl    
- 
    from #tmp_lock_who where id = @intCounter     
- 
    begin    
- 
    if @spid =0     
- 
        select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'    
- 
    else    
- 
        select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'    
- 
    DBCC INPUTBUFFER (@bl )    
- 
    end    
- 
    -- 循环指针下移    
- 
    set @intCounter = @intCounter + 1    
- 
    end    
- 
    drop table #tmp_lock_who    
- 
    return 0    
- 
end     
- 
*/ 
查看进程中正在执行的SQL
- 
dbcc inputbuffer(spid)  
- 
 
- 
exec sp_who3  
- 
/*  
- 
CREATE PROCEDURE sp_who3 ( @SessionID INT = NULL )  
- 
AS   
- 
    BEGIN  
- 
  
- 
  
- 
        SELECT  SPID = er.session_id ,  
- 
                Status = ses.status ,  
- 
                [Login] = ses.login_name ,  
- 
                Host = ses.host_name ,  
- 
                BlkBy = er.blocking_session_id ,  
- 
                DBName = DB_NAME(er.database_id) ,  
- 
                CommandType = er.command ,  
- 
                SQLStatement = st.text ,  
- 
                ObjectName = OBJECT_NAME(st.objectid) ,  
- 
                ElapsedMS = er.total_elapsed_time ,  
- 
                CPUTime = er.cpu_time ,  
- 
                IOReads = er.logical_reads + er.reads ,  
- 
                IOWrites = er.writes ,  
- 
                LastWaitType = er.last_wait_type ,  
- 
                StartTime = er.start_time ,  
- 
                Protocol = con.net_transport ,  
- 
                ConnectionWrites = con.num_writes ,  
- 
                ConnectionReads = con.num_reads ,  
- 
                ClientAddress = con.client_net_address ,  
- 
                Authentication = con.auth_scheme  
- 
        FROM    sys.dm_exec_requests er  
- 
                OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st  
- 
                LEFT JOIN sys.dm_exec_sessions ses ON ses.session_id = er.session_id  
- 
                LEFT JOIN sys.dm_exec_connections con ON con.session_id = ses.session_id  
- 
        WHERE   er.session_id > 50  
- 
                AND @SessionID IS NULL  
- 
                OR er.session_id = @SessionID  
- 
        ORDER BY er.blocking_session_id DESC ,  
- 
                er.session_id   
- 
  
- 
  
- 
    END  
- 
*/ 
2、top 语句
- 
--SQL Server启动以来累计使用CPU资源最多的语句。
- 
select 
- 
    highest_cpu_queries.*,
- 
    
- 
    q.dbid, 
- 
    q.objectid, 
- 
    q.number, 
- 
    q.encrypted,
- 
     q.[text]
- 
from 
- 
(
- 
	select top 10 qs.*
- 
	from sys.dm_exec_query_stats qs
- 
	order by qs.total_worker_time desc
- 
) as highest_cpu_queries
- 
 
- 
cross apply sys.dm_exec_sql_text(plan_handle) as q
- 
--where text like '%%'
- 
order by highest_cpu_queries.total_worker_time desc
- 
 
- 
 
- 
 
- 
--我们也可以找到最经常做编重新译的存储过程,也就是recompile过。
- 
select top 10  
- 
    a.sql_handle, 
- 
    a.plan_generation_num,  
- 
    a.execution_count,
- 
    
- 
    s.dbid,  
- 
    s.objectid,
- 
    s.text 
- 
from sys.dm_exec_query_stats a
- 
cross apply sys.dm_exec_sql_text(sql_handle) as s
- 
 
- 
where plan_generation_num >1
- 
order by plan_generation_num desc
- 
 
- 
 
- 
 
- 
--返回做IO数目最多的10条语句以及它们的执行计划
- 
select top 10 
- 
    
- 
    (qs.total_logical_reads / qs.execution_count) as avg_logical_reads,
- 
    (qs.total_logical_writes / qs.execution_count) as avg_logical_writes,
- 
    (qs.total_physical_reads / qs.execution_count) as avg_phys_reads,
- 
    
- 
    qs.execution_count, 
- 
     
- 
	qs.statement_start_offset,
- 
	qs.statement_end_offset,
- 
	
- 
	qt.dbid,
- 
	qt.objectid,
- 
	
- 
	SUBSTRING(qt.text,
- 
	          qs.statement_start_offset/2, 
- 
	    	  (case when qs.statement_end_offset = -1 
- 
		                 then len(convert(nvarchar(max), qt.text)) * 2 
- 
	                else qs.statement_end_offset 
- 
		       end - qs.statement_start_offset
- 
		       ) / 2  + 1
- 
		      ) as statement    
- 
from sys.dm_exec_query_stats qs
- 
cross apply sys.dm_exec_sql_text(sql_handle) as qt
- 
cross apply sys.dm_exec_query_plan(plan_handle) as q
- 
order by 
- 
 (total_logical_reads + total_logical_writes) / Execution_count Desc
- 
 
- 
 
- 
 
- 
--返回最经常运行的10条语句
- 
SELECT TOP 10
- 
	cp.cacheobjtype,
- 
	
- 
	cp.usecounts,      --使用这个缓存的执行计划的次数
- 
	cp.size_in_bytes,  --缓存的执行计划使用的字节数
- 
	
- 
	qs.execution_count,     --执行次数,与usecounts相等.
- 
	qs.plan_generation_num, --用来区分:重新编译语句和存储过程
- 
		 
- 
	qs.statement_start_offset,
- 
	qs.statement_end_offset,
- 
	
- 
	qt.dbid,
- 
	qt.objectid,
- 
	SUBSTRING(qt.text,
- 
	          qs.statement_start_offset/2, 
- 
	    	  (case when qs.statement_end_offset = -1 
- 
		                 then len(convert(nvarchar(max), qt.text)) * 2 
- 
	                else qs.statement_end_offset 
- 
		       end - qs.statement_start_offset
- 
		       ) / 2  + 1
- 
		      ) as statement
- 
FROM sys.dm_exec_query_stats qs
- 
 
- 
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
- 
 
- 
inner join sys.dm_exec_cached_plans as cp 
- 
		on qs.plan_handle=cp.plan_handle
- 
           and cp.plan_handle=qs.plan_handle
- 
           
- 
where cp.usecounts>4
- 
ORDER BY [dbid],[Usecounts] DESC
3、索引
- 
-- 当前数据库可能缺少的索引
- 
select 
- 
	s.group_handle,     --标识缺失索引组,在服务器中是唯一的,一个索引组仅包含一个索引
- 
	
- 
	s.unique_compiles,  --从索缺失索引组受益的不同查询的编译和重新编译数
- 
	
- 
	s.user_seeks,      --如果用户查询使用了组中建议索引,所导致的查找次数
- 
	s.user_scans,      --如果用户查询使用了组中建议索引,所导致的扫描次数  
- 
	s.last_user_seek,  --如果用户查询使用了组中建议索引,所导致上次查找的日期和时间
- 
	s.last_user_scan,  --如果用户查询使用了组中建议索引,所导致上次扫描的日期和时间
- 
	s.avg_total_user_cost, --如果用户查询使用了组中建议索引,所能减少的平均成本
- 
	s.avg_user_impact,     --如果实现了建议索引,那么用户查询的成本将按此百分比平均下降
- 
	
- 
	s.system_seeks,    --如果系统查询(如自动统计信息查询)使用了组中建议索引,所导致的查找次数
- 
	s.system_scans,    --如果系统查询使用了组中建议索引,所导致的扫描次数
- 
	s.last_system_seek,      --如果系统查询使用了组中建议索引,所导致上次查找的日期和时间
- 
	s.last_system_scan,      --如果系统查询使用了组中建议索引,所导致上次扫描的日期和时间
- 
	s.avg_total_system_cost, --如果系统查询使用了组中建议索引,所能减少的平均成本
- 
	s.avg_system_impact,     --如果实现了建议索引,那么系统查询的成本将按此百分比平均下降
- 
	
- 
	
- 
	g.index_group_handle, --标识缺失索引组
- 
	g.index_handle,       --标识由index_group_handle组指定的缺失索引。一个索引组包含一个索引
- 
	
- 
	
- 
	d.index_handle,
- 
	d.database_id,       --标识索引缺失的表所在的数据库id
- 
	d.object_id,         --标识索引缺失的表
- 
	d.statement,
- 
	
- 
	d.equality_columns,  --构成相等谓词的列的逗号分隔列表,如下:table.column = constant_value
- 
	d.inequality_columns,--构成不等谓词的列的逗号分隔列表,=之外的任何比较运算符都表示不等.
- 
                         --以下形式的谓词:table.column > constant_value
- 
	d.included_columns,  --用于查询的涵盖列的逗号分隔列表。有关涵盖列或包含列的详细信息
- 
	
- 
	c.column_id,
- 
	c.column_name,
- 
	c.column_usage  /*
- 
					  EQUALITY:列提供一个表示相等的谓词,形式为:table.column = constant_value				 
- 
					  INEQUALITY:列包含表示不等的谓词,形式为:table.column > constant_value
- 
					  INCLUDE:列不用于谓词赋值,但用于其他原因,例如包含一个查询。
- 
  					  =之外的任何比较运算符都表示不等。
- 
					*/	
- 
from sys.dm_db_missing_index_group_stats s    --缺失索引组的摘要信息,不包括空间索引
- 
inner join sys.dm_db_missing_index_groups g   --特定缺失索引组中包含的缺失索引(不含空间索引)信息
- 
        on s.group_handle = g.index_group_handle       
- 
inner join sys.dm_db_missing_index_details d  --返回有关缺失索引的详细信息,不包括空间索引
- 
        on d.index_handle = g.index_handle
- 
cross apply sys.dm_db_missing_index_columns(d.index_handle) c  --缺少索引的表的列的信息
- 
order by s.avg_user_impact desc
- 
 
- 
 
- 
 
- 
--索引的使用情况
- 
select DB_NAME(t.database_id)  dbname,
- 
       OBJECT_NAME(t.object_id) tablename,
- 
       
- 
       i.name indexname,
- 
       t.user_seeks,
- 
       t.user_scans,
- 
       t.user_lookups,
- 
       t.user_updates
- 
from sys.dm_db_index_usage_stats t
- 
inner join sys.indexes i
- 
        on t.object_id = i.object_id and
- 
           t.index_id = i.index_id 
- 
 
- 
 
- 
 
- 
--修改次数最多的索引,通过Database_id,object_id,index_id和partition_number找是哪个数据库的哪个索引
- 
SELECT top 100 * 
- 
FROM sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL)
- 
order by leaf_insert_count + 
- 
         leaf_delete_count + 
- 
         leaf_update_count desc
- 
 
- 
 
- 
 
- 
--返回当前数据库所有碎片率大于25%的索引
- 
declare @dbid int
- 
select @dbid = db_id()
- 
 
- 
SELECT * 
- 
FROM sys.dm_db_index_physical_stats (@dbid, NULL, NULL, NULL, NULL)
- 
where avg_fragmentation_in_percent > 25
- 
 
- 
order by avg_fragmentation_in_percent desc
- 
 
- 
 
- 
 
- 
--页的分裂次数,可以适当加大fillfactor的值
- 
use master
- 
go
- 
 
- 
select leaf_allocation_count,     --由于页拆分所引起的页分配的累积计数
- 
       nonleaf_allocation_count,  --叶级以上由页拆分引起的页分配的累积计数
- 
       
- 
       leaf_page_merge_count,   --叶级页合并的累积计数
- 
       nonleaf_page_merge_count --叶级以上页合并的累积计数
- 
from sys.dm_db_index_operational_stats
- 
(
- 
db_id('数据库名'),object_id('数据库名.dbo.temp_lock'),1,null
- 
)
4、如何用脚本获得sql server作业的执行情况
- 
select j.name as job_name,
- 
       
- 
       js.step_name,
- 
       
- 
       h.run_date,
- 
       h.run_time,
- 
       h.run_duration,
- 
       h.server,
- 
       
- 
       case run_status
- 
            when 0  then '失败'
- 
            when 1  then '成功'
- 
            when 2  then '重试'
- 
            when 3  then '取消'
- 
            when 4  then '正在进行'
- 
       end as run_status
- 
            
- 
from msdb.dbo.sysjobhistory h
- 
 
- 
inner join msdb.dbo.sysjobs j
- 
        on h.job_id = j.job_id
- 
        
- 
inner join msdb.dbo.sysjobsteps js
- 
        on js.job_id = h.job_id
- 
           and js.step_id = h.step_id
【SQL Server DBA】日常巡检语句3:特定监控(阻塞、top语句、索引、作业)的更多相关文章
- SQL Server DBA日常运维语句
		1.检查数据库完整性 dbcc checkdb(Portal) 检查数据库完整性checkdb Portal的 DBCC 结果. Service Broker 消息 9675,状态 1: 已分析的消息 ... 
- SQL Server DBA日常查询视图_数据库对象视图
		1.数据库 use master; exec sp_helpdb 1.1查询数据库大小 1.2查询数据库状态 use msdb select name, user_access_desc, --用户访 ... 
- SQL Server DBA日常查询视图_数据库性能视图
		1.获取有关按平均CPU 时间排在最前面的五个查询的信息 total_worker_time/execution_count AS [Avg CPU Time], ), ((CASE qs.state ... 
- 【SQL Server DBA】维护语句:删除并创建外键约束、获取建表语句
		原文:[SQL Server DBA]维护语句:删除并创建外键约束.获取建表语句 1.删除外键约束,建立外键约束 先建立3个表: /* drop table tb drop table tb_b dr ... 
- 一名小小的SQL Server DBA想谈一下SQL Server的能力
		一名小小的SQL Server DBA想谈一下SQL Server的能力 百度上暂时还没有搜索到相关的个人写的比较有价值的文章,至少在中文网络的世界里面没有 但是在微软的网站有这样一篇文章:<比 ... 
- 第三篇——第二部分——第五文 配置SQL Server镜像——域环境SQL Server镜像日常维护
		本文接上面两篇搭建镜像的文章: 第三篇--第二部分--第三文 配置SQL Server镜像--域环境:http://blog.csdn.net/dba_huangzj/article/details/ ... 
- 2年SQL Server DBA调优方面总结
		原文:2年SQL Server DBA调优方面总结 2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Serv ... 
- [转]2年SQL Server DBA调优方面总结
		2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Server 2008 系列> 这个就是mssql ... 
- SQL Server 更改跟踪(Chang Tracking)监控表数据
		一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 主要区别与对比(Compare) 实现监控表数据步骤(Process) 参考文献(Refere ... 
随机推荐
- 续--Flask, Django - 区别
			1. 目录结构 参考:https://blog.csdn.net/yang9520/article/details/79740374 中文文档(http://docs.jinkan.o ... 
- $createElement实现自定义弹窗
			<el-button type="text" @click="open4">点击打开 Message Box</el-button> m ... 
- web前端之es6对象的扩展
			1.属性的简洁表示法 2.属性名表达式 表达式作为对象的属性名 3.方法的 name 属性 例如:函数的name 属性,返回函数名. 4.Object.is() ES 比较两个值是否相等,只有两个运算 ... 
- win10安装RabbitMQ
			简单来说,两步走:先装erlang,再装rabbitmq.rabbitmq是用erlang开发的,既然erlang是一种语言,你可以把它当做Jdk来安装. 1.下载erlang安装包(官网下载地址ht ... 
- Qt编写自定义控件59-直方动态图
			一.前言 直方动态图类似于音乐播放时候的柱状图展示,顶部提供一个横线条,当柱状上升的时候,该线条类似于帽子的形式冲到顶端,相当于柱状顶上去的感觉,给人一种动态的感觉,听音乐的同时更加赏心悦目,原理比较 ... 
- 一百四十二:CMS系统之帖子详情页面布局
			定义一个404页面 <!DOCTYPE html><html lang="en"><head> <meta charset="U ... 
- VL10B 采购订单转DN
			传入采购订单项目建交货单 FUNCTION zmmfmXXXX. *"------------------------------------------------------------ ... 
- VCL组件之TPanel
			TPanel位于Standard组件面板上,也是常用的一种容器控件.面板的一个优点就是放在面板上的组件称为面板的一部分,因此它们与面板一起移动.这在设计阶段很有用. Panel组件的大部分功能在于其A ... 
- windows下配置Sublime Text 2开发Nodejs
			1 下载 Sublime Text 2 http://www.sublimetext.com/ 2 下载Nodejs插件,下载ZIP包 https://github.com/tanepiper/Sub ... 
- LSTM改善RNN梯度弥散和梯度爆炸问题
			我们给定一个三个时间的RNN单元,如下: 我们假设最左端的输入 为给定值, 且神经元中没有激活函数(便于分析), 则前向过程如下: 在 时刻, 损失函数为 ,那么如果我们要训练RNN时, 实际上 ... 
 
			
		