【SQL Server DBA】日常巡检语句3:特定监控(阻塞、top语句、索引、作业)

来源:互联网 发布:软件开发公司名字 编辑:程序博客网 时间:2024/05/18 16:58

【SQL Server DBA】日常巡检语句3:特定监控(阻塞、top语句、索引、作业)

原创 2013年10月15日 17:49:13

 

1、查询阻塞信息、锁定了哪些资源

[sql] view plain copy
  1. --1.查看阻塞信息  
  2. select spid,loginame,waitresource from master..sysprocesses   
  3. where blocked <> 0  
  4. /*  
  5. spid    loginame    waitresource  
  6. 53  ggg-PC\Administrator RID:1:1:1385:0  
  7. */  
  8.   
  9.   
  10.   
  11. --2.查看语句  
  12. dbcc inputbuffer(53)  
  13. /*  
  14. eventInfo  
  15. select * from xx  
  16. */  
  17.   
  18.   
  19.   
  20. --3.查看锁的信息  
  21. exec sp_lock @spid1 = 53  
  22. /*  
  23. spid    dbid    ObjId   IndId   Type    Resource    Mode    Status  
  24. 53  1   1335727861  0   PAG 1:1385                              IS  GRANT  
  25. 53  1   1335727861  0   RID 1:1385:0                            S   WAIT  
  26. 53  1   1335727861  0   TAB                                     IS  GRANT  
  27. */  
  28.   
  29. --select OBJECT_ID(1335727861) as table_name  
  30.   
  31.   
  32.   
  33. --4.打开数据库  
  34. select *  
  35. from sysdatabases  
  36. where dbid = 1  
  37. /*  
  38. name    dbid    sid mode    status  status2 crdate  reserved    category    cmptlevel   filename    version  
  39. 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  
  40. */  
  41.   
  42.   
  43.   
  44. --5.根据锁信息中的ObjId列:1335727861,找到了这个xx表  
  45. select *  
  46. from sysobjects  
  47. where id = 1335727861  
  48. /*  
  49. 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  
  50. 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  
  51. */  


查找死锁

[sql] view plain copy
  1. exec sp_who_lock    
  2. /*    
  3. create procedure sp_who_lock      
  4. as      
  5. begin      
  6.     declare @spid int,@bl int,      
  7.     @intTransactionCountOnEntry int,      
  8.     @intRowcount int,      
  9.     @intCountProperties int,      
  10.     @intCounter int      
  11.     create table #tmp_lock_who (id int identity(1,1),spid smallint,bl smallint)      
  12.     IF @@ERROR<>0 RETURN @@ERROR      
  13.     insert into #tmp_lock_who(spid,bl) select 0 ,blocked      
  14.     from (select * from sys.sysprocesses where blocked>0 ) a       
  15.     where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b       
  16.     where a.blocked=spid)      
  17.     union select spid,blocked from sys.sysprocesses where blocked>0      
  18.     IF @@ERROR<>0 RETURN @@ERROR      
  19.         -- 找到临时表的记录数      
  20.         select @intCountProperties = Count(*),@intCounter = 1      
  21.         from #tmp_lock_who      
  22.     IF @@ERROR<>0 RETURN @@ERROR      
  23.     if @intCountProperties=0      
  24.     select '现在没有阻塞和死锁信息' as message      
  25.     -- 循环开始      
  26.     while @intCounter <= @intCountProperties      
  27.     begin      
  28.     -- 取第一条记录      
  29.     select @spid = spid,@bl = bl      
  30.     from #tmp_lock_who where id = @intCounter       
  31.     begin      
  32.     if @spid =0       
  33.         select '引起数据库死锁的是: 'CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'      
  34.     else      
  35.         select '进程号SPID:'CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'      
  36.     DBCC INPUTBUFFER (@bl )      
  37.     end      
  38.     -- 循环指针下移      
  39.     set @intCounter = @intCounter + 1      
  40.     end      
  41.     drop table #tmp_lock_who      
  42.     return 0      
  43. end       
  44. */   


查看进程中正在执行的SQL

[sql] view plain copy
  1. dbcc inputbuffer(spid)    
  2.   
  3. exec sp_who3    
  4. /*    
  5. CREATE PROCEDURE sp_who3 ( @SessionID INT = NULL )    
  6. AS     
  7.     BEGIN    
  8.     
  9.     
  10.         SELECT  SPID = er.session_id ,    
  11.                 Status = ses.status ,    
  12.                 [Login] = ses.login_name ,    
  13.                 Host = ses.host_name ,    
  14.                 BlkBy = er.blocking_session_id ,    
  15.                 DBName = DB_NAME(er.database_id) ,    
  16.                 CommandType = er.command ,    
  17.                 SQLStatement = st.text ,    
  18.                 ObjectName = OBJECT_NAME(st.objectid) ,    
  19.                 ElapsedMS = er.total_elapsed_time ,    
  20.                 CPUTime = er.cpu_time ,    
  21.                 IOReads = er.logical_reads + er.reads ,    
  22.                 IOWrites = er.writes ,    
  23.                 LastWaitType = er.last_wait_type ,    
  24.                 StartTime = er.start_time ,    
  25.                 Protocol = con.net_transport ,    
  26.                 ConnectionWrites = con.num_writes ,    
  27.                 ConnectionReads = con.num_reads ,    
  28.                 ClientAddress = con.client_net_address ,    
  29.                 Authentication = con.auth_scheme    
  30.         FROM    sys.dm_exec_requests er    
  31.                 OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st    
  32.                 LEFT JOIN sys.dm_exec_sessions ses ON ses.session_id = er.session_id    
  33.                 LEFT JOIN sys.dm_exec_connections con ON con.session_id = ses.session_id    
  34.         WHERE   er.session_id > 50    
  35.                 AND @SessionID IS NULL    
  36.                 OR er.session_id = @SessionID    
  37.         ORDER BY er.blocking_session_id DESC ,    
  38.                 er.session_id     
  39.     
  40.     
  41.     END    
  42. */   

2、top 语句

[sql] view plain copy
  1. --SQL Server启动以来累计使用CPU资源最多的语句。  
  2. select   
  3.     highest_cpu_queries.*,  
  4.       
  5.     q.dbid,   
  6.     q.objectid,   
  7.     q.number,   
  8.     q.encrypted,  
  9.      q.[text]  
  10. from   
  11. (  
  12.     select top 10 qs.*  
  13.     from sys.dm_exec_query_stats qs  
  14.     order by qs.total_worker_time desc  
  15. as highest_cpu_queries  
  16.   
  17. cross apply sys.dm_exec_sql_text(plan_handle) as q  
  18. --where text like '%%'  
  19. order by highest_cpu_queries.total_worker_time desc  
  20.   
  21.   
  22.   
  23. --我们也可以找到最经常做编重新译的存储过程,也就是recompile过。  
  24. select top 10    
  25.     a.sql_handle,   
  26.     a.plan_generation_num,    
  27.     a.execution_count,  
  28.       
  29.     s.dbid,    
  30.     s.objectid,  
  31.     s.text   
  32. from sys.dm_exec_query_stats a  
  33. cross apply sys.dm_exec_sql_text(sql_handle) as s  
  34.   
  35. where plan_generation_num >1  
  36. order by plan_generation_num desc  
  37.   
  38.   
  39.   
  40. --返回做IO数目最多的10条语句以及它们的执行计划  
  41. select top 10   
  42.       
  43.     (qs.total_logical_reads / qs.execution_count) as avg_logical_reads,  
  44.     (qs.total_logical_writes / qs.execution_count) as avg_logical_writes,  
  45.     (qs.total_physical_reads / qs.execution_count) as avg_phys_reads,  
  46.       
  47.     qs.execution_count,   
  48.        
  49.     qs.statement_start_offset,  
  50.     qs.statement_end_offset,  
  51.       
  52.     qt.dbid,  
  53.     qt.objectid,  
  54.       
  55.     SUBSTRING(qt.text,  
  56.               qs.statement_start_offset/2,   
  57.               (case when qs.statement_end_offset = -1   
  58.                          then len(convert(nvarchar(max), qt.text)) * 2   
  59.                     else qs.statement_end_offset   
  60.                end - qs.statement_start_offset  
  61.                ) / 2  + 1  
  62.               ) as statement      
  63. from sys.dm_exec_query_stats qs  
  64. cross apply sys.dm_exec_sql_text(sql_handle) as qt  
  65. cross apply sys.dm_exec_query_plan(plan_handle) as q  
  66. order by   
  67.  (total_logical_reads + total_logical_writes) / Execution_count Desc  
  68.   
  69.   
  70.   
  71. --返回最经常运行的10条语句  
  72. SELECT TOP 10  
  73.     cp.cacheobjtype,  
  74.       
  75.     cp.usecounts,      --使用这个缓存的执行计划的次数  
  76.     cp.size_in_bytes,  --缓存的执行计划使用的字节数  
  77.       
  78.     qs.execution_count,     --执行次数,与usecounts相等.  
  79.     qs.plan_generation_num, --用来区分:重新编译语句和存储过程  
  80.            
  81.     qs.statement_start_offset,  
  82.     qs.statement_end_offset,  
  83.       
  84.     qt.dbid,  
  85.     qt.objectid,  
  86.     SUBSTRING(qt.text,  
  87.               qs.statement_start_offset/2,   
  88.               (case when qs.statement_end_offset = -1   
  89.                          then len(convert(nvarchar(max), qt.text)) * 2   
  90.                     else qs.statement_end_offset   
  91.                end - qs.statement_start_offset  
  92.                ) / 2  + 1  
  93.               ) as statement  
  94. FROM sys.dm_exec_query_stats qs  
  95.   
  96. cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt  
  97.   
  98. inner join sys.dm_exec_cached_plans as cp   
  99.         on qs.plan_handle=cp.plan_handle  
  100.            and cp.plan_handle=qs.plan_handle  
  101.              
  102. where cp.usecounts>4  
  103. ORDER BY [dbid],[Usecounts] DESC  


3、索引

[sql] view plain copy
  1. -- 当前数据库可能缺少的索引  
  2. select   
  3.     s.group_handle,     --标识缺失索引组,在服务器中是唯一的,一个索引组仅包含一个索引  
  4.       
  5.     s.unique_compiles,  --从索缺失索引组受益的不同查询的编译和重新编译数  
  6.       
  7.     s.user_seeks,      --如果用户查询使用了组中建议索引,所导致的查找次数  
  8.     s.user_scans,      --如果用户查询使用了组中建议索引,所导致的扫描次数    
  9.     s.last_user_seek,  --如果用户查询使用了组中建议索引,所导致上次查找的日期和时间  
  10.     s.last_user_scan,  --如果用户查询使用了组中建议索引,所导致上次扫描的日期和时间  
  11.     s.avg_total_user_cost, --如果用户查询使用了组中建议索引,所能减少的平均成本  
  12.     s.avg_user_impact,     --如果实现了建议索引,那么用户查询的成本将按此百分比平均下降  
  13.       
  14.     s.system_seeks,    --如果系统查询(如自动统计信息查询)使用了组中建议索引,所导致的查找次数  
  15.     s.system_scans,    --如果系统查询使用了组中建议索引,所导致的扫描次数  
  16.     s.last_system_seek,      --如果系统查询使用了组中建议索引,所导致上次查找的日期和时间  
  17.     s.last_system_scan,      --如果系统查询使用了组中建议索引,所导致上次扫描的日期和时间  
  18.     s.avg_total_system_cost, --如果系统查询使用了组中建议索引,所能减少的平均成本  
  19.     s.avg_system_impact,     --如果实现了建议索引,那么系统查询的成本将按此百分比平均下降  
  20.       
  21.       
  22.     g.index_group_handle, --标识缺失索引组  
  23.     g.index_handle,       --标识由index_group_handle组指定的缺失索引。一个索引组包含一个索引  
  24.       
  25.       
  26.     d.index_handle,  
  27.     d.database_id,       --标识索引缺失的表所在的数据库id  
  28.     d.object_id,         --标识索引缺失的表  
  29.     d.statement,  
  30.       
  31.     d.equality_columns,  --构成相等谓词的列的逗号分隔列表,如下:table.column = constant_value  
  32.     d.inequality_columns,--构成不等谓词的列的逗号分隔列表,=之外的任何比较运算符都表示不等.  
  33.                          --以下形式的谓词:table.column > constant_value  
  34.     d.included_columns,  --用于查询的涵盖列的逗号分隔列表。有关涵盖列或包含列的详细信息  
  35.       
  36.     c.column_id,  
  37.     c.column_name,  
  38.     c.column_usage  /*  
  39.                       EQUALITY:列提供一个表示相等的谓词,形式为:table.column = constant_value                  
  40.                       INEQUALITY:列包含表示不等的谓词,形式为:table.column > constant_value  
  41.                       INCLUDE:列不用于谓词赋值,但用于其他原因,例如包含一个查询。  
  42.                       =之外的任何比较运算符都表示不等。  
  43.                     */    
  44. from sys.dm_db_missing_index_group_stats s    --缺失索引组的摘要信息,不包括空间索引  
  45. inner join sys.dm_db_missing_index_groups g   --特定缺失索引组中包含的缺失索引(不含空间索引)信息  
  46.         on s.group_handle = g.index_group_handle         
  47. inner join sys.dm_db_missing_index_details d  --返回有关缺失索引的详细信息,不包括空间索引  
  48.         on d.index_handle = g.index_handle  
  49. cross apply sys.dm_db_missing_index_columns(d.index_handle) c  --缺少索引的表的列的信息  
  50. order by s.avg_user_impact desc  
  51.   
  52.   
  53.   
  54. --索引的使用情况  
  55. select DB_NAME(t.database_id)  dbname,  
  56.        OBJECT_NAME(t.object_id) tablename,  
  57.          
  58.        i.name indexname,  
  59.        t.user_seeks,  
  60.        t.user_scans,  
  61.        t.user_lookups,  
  62.        t.user_updates  
  63. from sys.dm_db_index_usage_stats t  
  64. inner join sys.indexes i  
  65.         on t.object_id = i.object_id and  
  66.            t.index_id = i.index_id   
  67.   
  68.   
  69.   
  70. --修改次数最多的索引,通过Database_id,object_id,index_id和partition_number找是哪个数据库的哪个索引  
  71. SELECT top 100 *   
  72. FROM sys.dm_db_index_operational_stats(NULLNULLNULLNULL)  
  73. order by leaf_insert_count +   
  74.          leaf_delete_count +   
  75.          leaf_update_count desc  
  76.   
  77.   
  78.   
  79. --返回当前数据库所有碎片率大于25%的索引  
  80. declare @dbid int  
  81. select @dbid = db_id()  
  82.   
  83. SELECT *   
  84. FROM sys.dm_db_index_physical_stats (@dbid, NULLNULLNULLNULL)  
  85. where avg_fragmentation_in_percent > 25  
  86.   
  87. order by avg_fragmentation_in_percent desc  
  88.   
  89.   
  90.   
  91. --页的分裂次数,可以适当加大fillfactor的值  
  92. use master  
  93. go  
  94.   
  95. select leaf_allocation_count,     --由于页拆分所引起的页分配的累积计数  
  96.        nonleaf_allocation_count,  --叶级以上由页拆分引起的页分配的累积计数  
  97.          
  98.        leaf_page_merge_count,   --叶级页合并的累积计数  
  99.        nonleaf_page_merge_count --叶级以上页合并的累积计数  
  100. from sys.dm_db_index_operational_stats  
  101. (  
  102. db_id('数据库名'),object_id('数据库名.dbo.temp_lock'),1,null  
  103. )  

4、如何用脚本获得sql server作业的执行情况

[sql] view plain copy
  1. select j.name as job_name,  
  2.          
  3.        js.step_name,  
  4.          
  5.        h.run_date,  
  6.        h.run_time,  
  7.        h.run_duration,  
  8.        h.server,  
  9.          
  10.        case run_status  
  11.             when 0  then '失败'  
  12.             when 1  then '成功'  
  13.             when 2  then '重试'  
  14.             when 3  then '取消'  
  15.             when 4  then '正在进行'  
  16.        end as run_status  
  17.               
  18. from msdb.dbo.sysjobhistory h  
  19.   
  20. inner join msdb.dbo.sysjobs j  
  21.         on h.job_id = j.job_id  
  22.           
  23. inner join msdb.dbo.sysjobsteps js  
  24.         on js.job_id = h.job_id  
  25.            and js.step_id = h.step_id  
  26.     
原创粉丝点击