当SQL Server 引擎接收到用户发出的查询请求时,SQL Server执行优化器将查询请求(Request)和Task绑定,并为Task分配一个Workder,SQL Server申请操作系统的进程(Thread)来执行Worker。如果以并行的方式执行Request,SQL Server根据Max DOP(Maximum Degree Of Parallelism) 配置选项创建新的Child Tasks,SQL Server将Request和多个Task绑定;例如,如果Max DOP=8,那么将会存在 1个Master Task和 8 个Child Tasks。每个Task绑定到一个Worker中,SQL Server引擎将分配相应数量的Worker来执行Tasks。
一,查看正在执行的请求(Request)
使用 sys.dm_exec_requests 返回正在执行的查询请求(Request)关联的查询脚本,阻塞和资源消耗。
1,查看SQL Server正在执行的查询语句
- sql_handle,statement_start_offset,statement_end_offset ,能够用于查看正在执行的查询语句;
- 字段plan_handle,用于查看查询语句的执行计划;
- 字段 command 用于表示正在被处理的Command的当前的类型:SELECT,INSERT,UPDATE,DELETE,BACKUP LOG ,BACKUP DATABASE,DBCC,FOR;
2,查看阻塞(Block)的语句
- 字段 wait_type:如果Request正在被阻塞,字段wait_type 返回当前的Wait Type
- 字段 last_wait_type:上一次阻塞的Wait Type
- 字段 wait_resource:当前阻塞的Request正在等待的资源
- 字段 blocking_session_id :将当前Request阻塞的Session
3,内存,IO,CPU消耗统计
- 字段 granted_query_memory: 授予内存的大小,Number of pages allocated to the execution of a query on the request
- 字段 cpu_time,total_elapsed_time :消耗的CPU时间和总的消耗时间
- 字段 reads,writes,logical_reads:物理Read,逻辑Write 和逻辑Read的次数
二,查看SQL Server 当前正在执行的SQL查询语句
在进行故障排除时,使用DMV:sys.dm_exec_requests 查看SQL Server当前正在执行的查询语句:
select db_name(r.database_id) as db_name ,s.group_id ,r.session_id ,r.blocking_session_id as blocking ,s.login_name ,r.wait_type as current_wait_type ,r.wait_resource ,r.last_wait_type ,r.wait_time/1000 as wait_s ,r.status as request_status ,r.command ,r.cpu_time/1000 as cpu_time_s ,r.reads ,r.writes ,r.logical_reads ,r.total_elapsed_time/1000 as total_elapsed_s ,r.start_time ,s.status as session_status ,substring( st.text, r.statement_start_offset/2+1, ( case when r.statement_end_offset = -1 then len(convert(nvarchar(max), st.text)) else (r.statement_end_offset - r.statement_start_offset)/2 end ) ) as individual_query ,s.program_name ,s.host_name from sys.dm_exec_requests r inner join sys.dm_exec_sessions s on r.session_id=s.session_id outer APPLY sys.dm_exec_sql_text(r.sql_handle) as st where ((r.wait_type<>'MISCELLANEOUS' and r.wait_type <> 'DISPATCHER_QUEUE_SEMAPHORE' ) or r.wait_type is null) and r.session_id>50 and r.session_id<>@@spid order by r.logical_reads desc
1,在故障排除时,可以过滤掉一些无用的wait type 和当前Session:
- @@SPID 表示当前的spid,一般来说,SPID<=50是system session,SPID>50的是User Session;
- WaitType 为'MISCELLANEOUS' 时,不用于标识任何有效的Wait,仅仅作为默认的Wait;
- WaitType 为‘DISPATCHER_QUEUE_SEMAPHORE’时,表示当前的Thread在等待处理更多的Work,如果Wait Time增加,说明Thread调度器(Dispatcher)非常空闲;
- 关于WaitType ,请查看 The SQL Server Wait Type Repository;
有一些wait type是仅供内部使用的(Internal use only),通常是系统请求,可以把这些wait type 过滤掉:
select db_name(r.database_id) as db_name ,s.group_id ,r.session_id ,r.blocking_session_id as blocking ,s.login_name ,r.wait_type as current_wait_type ,r.wait_resource ,r.last_wait_type ,r.wait_time/1000 as wait_s ,r.status as request_status ,r.command ,r.cpu_time/1000 as cpu_time_s ,r.reads ,r.writes ,r.logical_reads ,r.total_elapsed_time/1000 as total_elapsed_s ,r.start_time ,s.status as session_status ,substring( st.text, r.statement_start_offset/2+1, ( case when r.statement_end_offset = -1 then len(convert(nvarchar(max), st.text)) else (r.statement_end_offset - r.statement_start_offset)/2 end ) ) as individual_query ,s.program_name ,s.host_name from sys.dm_exec_requests r inner join sys.dm_exec_sessions s on r.session_id=s.session_id outer APPLY sys.dm_exec_sql_text(r.sql_handle) as st where r.session_id>50 and r.session_id<>@@spid and r.wait_type not in ( N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR', N'BROKER_TASK_STOP', N'BROKER_TO_FLUSH', N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE', N'CHKPT', N'CLR_AUTO_EVENT', N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE', N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE', N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD', N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE', N'EXECSYNC', N'FSAGENT', N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX', N'HADR_CLUSAPI_CALL', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', N'HADR_LOGCAPTURE_WAIT', N'HADR_NOTIFICATION_DEQUEUE', N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE', N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP', N'LOGMGR_QUEUE', N'ONDEMAND_TASK_QUEUE', N'PWAIT_ALL_COMPONENTS_INITIALIZED', N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE', N'SERVER_IDLE_CHECK', N'SLEEP_BPOOL_FLUSH', N'SLEEP_DBSTARTUP', N'SLEEP_DCOMSTARTUP', N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY', N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP', N'SLEEP_SYSTEMTASK', N'SLEEP_TASK', N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT', N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', N'SQLTRACE_WAIT_ENTRIES', N'WAIT_FOR_RESULTS', N'WAITFOR', N'WAITFOR_TASKSHUTDOWN', N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', N'WAIT_XTP_CKPT_CLOSE', N'XE_DISPATCHER_JOIN', N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT', N'XE_LIVE_TARGET_TVF',N'PWAIT_DIRECTLOGCONSUMER_GETNEXT' ) order by r.session_id asc