等待大概分为3类:资源等待、队列等待、外部等待

过滤掉系统相关的等待类型的语句。(查看常用的等待信息)

SELECT  wait_type ,
signal_wait_time_ms ,
wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_time_ms > 0
AND wait_type NOT IN ( 'CLR_SEMAPHORE', 'CLR_AUTO_EVENT',
'LAZYWRITER_SLEEP', 'RESOURCE_QUEUE',
'SLEEP_TASK', 'SLEEP_SYSTEMTASK',
'SQLTRACE_BUFFER_FLUSH', 'WAITFOR',
'LOGMGR_QUEUE', 'CHECKPOINT_QUEUE',
'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT',
'BROKER_TO_FLUSH', 'BROKER_TASK_STOP',
'CLR_MANUAL_EVENT',
'DISPATCHER_QUEUE_SEMAPHORE',
'FT_IFTS_SCHEDULER_IDLE_WAIT',
'XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN',
'SQLTRACE_INCREMENTAL_FLUSH_SLEEP' )
ORDER BY signal_wait_time_ms DESC

生产环境中使用:

DBCC SQLPERF('sys.dm_os_wait_stats',CLEAR)

当A正在更新一个表并把表锁住时,B也想去读这个表,此时B就必须等待A完成。对于这种情况,可以使用DMV:sys.dm_os_waiting_tasks查看当前正在处于等待状态的会话(sessions),并展示会等待的资源。如果某个会话正在等待某些资源,那么这个DMV结果中的blocking_session_id列就会有这个Session_id

另一个DMV:sys.dm_exec_requests用于返回当前实例上每个用户和内部的连接信息

常见的等待类型:

1.并行执行   2.多任务等待  3.I/O等待  4.备份还原等待   5.锁定等待  6.数据库日志等待 7.外部资源等待

一:并行执行

并行操作最常见的等待类型是CXPACKET

如果是OLTP系统,理想情况下事务很短,就没有必要通过并行运行来提高运行速度了,极端方法,把最大并行度设为1,强制SQL Server 不去使用并行操作,从而减少不必要的资源等待

SELECT  *
FROM sys.configurations
WHERE name LIKE '%Max Degree of Parallelism%'
GO
EXEC sys.sp_configure N'show advanced options', N'1'
GO
RECONFIGURE
GO
EXEC sys.sp_configure N'Max Degree of Parallelism', N'1'
GO
RECONFIGURE

如果是OLAP系统,由于事务普遍较长,所以并行操作往往能提高速度和资源利用率。把最大并行度设为0

以下的脚本用于查询计划缓存中存在并行查询的语句

SELECT TOP 10
p.* ,
q.* ,
qs.* ,
cp.plan_handle
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.Dm_exec_query_plan(cp.plan_handle) p
CROSS APPLY sys.Dm_exec_sql_text(cp.plan_handle) AS q
JOIN sys.dm_exec_query_stats qs ON qs.plan_handle = cp.plan_handle
WHERE cp.cacheobjtype = 'Compiled Plan'
AND p.query_plan.value('declare namespace p="http://schemas.microsoft.com/SQL Server/2004/07/showplan";
max(//p:RelOp/@Parallel)', 'float') > 0
OPTION ( MAXDOP 1 )

CXPACKET潜在问题:

一个服务器上部署OLTP和OLAP

EXEC sys.sp_configure N'cost threshold for parallelism',N'25'
EXEC sys.sp_configure N'Max Degree of Parallelism',N'2'
RECONFIGURE WITH OVERRIDE --刷新数据库的配置

常见的引起CXPACKET等待类型的情况:

1.在可变类型中数据的分布存在严重倾斜,某列varchar类型的数据,有些数据的长度是60bytes,有些却达到500bytes,对这样的数据进行查询时,会导致执行计划不够高效,也会导致统计信息的可参考性降低。在并行执行时,容易出现某个线程执行很快但另外一个执行很慢的情况,从而增加了CXPACKET的出现概率。

2.在并发的过程中,如果一个线程出现了资源瓶颈,会导致这个线程的速度比其他线程要慢,从而影响整体的运行速度。

3.查询所需要的数据存放在不同的I/O子系统中,而这些子系统的性能又存在差异最终的结果跟上面的第二种情况类似。

4.查询所需要的数据中,不同部分的碎皮不同,所需要的I/O也不同。I/O数量直接影响运行速度和资源开销,甚至影响执行计划的生成,从而也导致了查询过程中不同线程部分的运行速度出现差异。

CXPACKET建议:

1.碎片问题,则减少碎片。

2.从物理文件的存放上要避免出现同一查询的不同部分因为I/O性能差异而出现差异。简单来说就是要保证数据文件所在的盘性能相等

3.尽可能保持统计信息的实时性

4.过多的线程会导致上下文切换开销,也容易引起CXPACkET等待,所以在改动这方面配置时,需要进行严谨的测试和监控

5.绝大部分性能问题的终极方案----优化,从数据库设计、查询编码、索引设计上进行优化

6.最常见的问题是由于查询性能过低,导致SQL Server选择了并行操作,而并行操作又存在一些问题

7.把前面的cost threshold parallelism的值设高

在SQL Server 运行过程中,常常会有不同类型的任务在运行,其中由这种操作产生的等待类型最常见的是SOS_SCHEDULER_YIELD

SOS_SCHEDULER_YIELD等待类型就发生在一个任务自愿放弃当前的资源占用,让给其他任务使用的时候。

用sys.dm_os_sehedulers看看当前有多少runnable的任务在系统中运行

SELECT scheduler_id,current_tasks_count,runnable_tasks_count,work_queue_count,pending_disk_io_count FROM sys.dm_os_schedulers WHERE scheduler_id<255

关注runnable_tasks_count这个列的数据,如果见到长时间存在两位数的数值,意味着CPU可能存在压力,无法应对当前负载。

降低SOS_SCHEDULER_YIELD等待。

查看使用CPU最多的查询语句,针对这些结果来进行优化,还可以查找运行时间最长的脚本进行优化。

SELECT  SUBSTRING(qt.text, ( qs.statement_start_offset / 2 ) + 1,
( ( CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset ) / 2 ) + 1) ,
qs.execution_count ,
qs.total_logical_reads ,
qs.last_logical_reads ,
qs.total_logical_writes ,
qs.last_logical_writes ,
qs.total_worker_time ,
qs.last_worker_time ,
qs.total_elapsed_time / 1000000 AS total_elapsed_time_in_S ,
qs.last_elapsed_time / 1000000 AS last_elapsed_time_in_S ,
qs.last_execution_time ,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.sql_handle) qp
ORDER BY qs.total_worker_time DESC --CPU时间

检查 活动事务的日志情况脚本。

SELECT  DTST.[session_id] ,
DES.[login_name] AS [Login Name] ,
DB_NAME(DTDT.database_id) AS [Database] ,
DTDT.[database_transaction_begin_time] AS [Begin Time] ,
-- DATEDIFF(ms,DTDT.[database_transaction_begin_time], GETDATE()) AS [Durationms],
CASE DTAT.transaction_type
WHEN 1 THEN 'Read/write'
WHEN 2 THEN 'Read-only'
WHEN 3 THEN 'System'
WHEN 4 THEN 'Distributed'
END AS [Transaction Type] ,
CASE DTAT.transaction_state
WHEN 0 THEN 'Not fully initialized'
WHEN 1 THEN 'Initialized, not started'
WHEN 2 THEN 'Active'
WHEN 3 THEN 'Ended'
WHEN 4 THEN 'Commit initiated'
WHEN 5 THEN 'Prepared, awaiting resolution'
WHEN 6 THEN 'Committed'
WHEN 7 THEN 'Rolling back'
WHEN 8 THEN 'Rolled back'
END AS [Transaction State] ,
DTDT.[database_transaction_log_record_count] AS [Log Records] ,
DTDT.[database_transaction_log_bytes_used] AS [Log Bytes Used] ,
DTDT.[database_transaction_log_bytes_reserved] AS [Log Bytes RSVPd] ,
DEST.[text] AS [Last Transaction Text] ,
DEQP.[query_plan] AS [Last Query Plan]
FROM sys.dm_tran_database_transactions DTDT
INNER JOIN sys.dm_tran_session_transactions DTST ON DTST.[transaction_id] = DTDT.[transaction_id]
INNER JOIN sys.[dm_tran_active_transactions] DTAT ON DTST.[transaction_id] = DTAT.[transaction_id]
INNER JOIN sys.[dm_exec_sessions] DES ON DES.[session_id] = DTST.[session_id]
INNER JOIN sys.dm_exec_connections DEC ON DEC.[session_id] = DTST.[session_id]
LEFT JOIN sys.dm_exec_requests DER ON DER.[session_id] = DTST.[session_id]
CROSS APPLY sys.dm_exec_sql_text(DEC.[most_recent_sql_handle]) AS DEST
OUTER APPLY sys.dm_exec_query_plan(DER.[plan_handle]) AS DEQP
ORDER BY DTDT.[database_transaction_log_bytes_used] DESC;
-- ORDER BY [Duration ms] DESC;

SQL Server等待的更多相关文章

  1. [转载]sql server 等待类型

    下表列出各任务所遇到的等待类型. 等待类型 说明 ASYNC_DISKPOOL_LOCK 当尝试同步并行的线程(执行创建或初始化文件等任务)时出现. ASYNC_IO_COMPLETION 当某任务正 ...

  2. sql server等待类型

    sql server 各种等待类型-转 sql server各个等待类型及解决办法:https://www.sqlskills.com/help/waits/writelog/其他等待类型的描述和解决 ...

  3. [翻译]SQL Server等待事件—THREADPOOL

      前言: 本文是对SQLSkills上一篇关于SQL Server中THREADPOOL等待的博客的翻译,本文也不是完全翻译,有些地方适当加入了自己的一些认知.如有翻译不对或不好的地方,敬请指出,大 ...

  4. SQL Server等待事件—RESOURCE_SEMAPHORE_QUERY_COMPILE

    等待事件介绍 关于等待事件RESOURCE_SEMAPHORE_QUERY_COMPILE,官方的介绍如下: Occurs when the number of concurrent query co ...

  5. SQL Server等待事件新解

    资源等待类型 并行:CXPACKET Buffer:PAGEIOLATCH_X 非Buffer:LATCH_X I/O:ASYNC_IO_COMPITION:IO_COMPITION CPU:SOS_ ...

  6. SQL Server 等待统计信息基线收集

    背景 我们随时监控每个服务器不同时间段的wait statistics ,可以根据监控信息大概判断什么时候开始出现异常,相当于一个wait statistics基线收集,还可以具体分析占比高的等待类型 ...

  7. SQL Server等待事件—PAGEIOLATCH_EX

    什么是PAGEIOLATCH_EX等待事件? 下面我们将对PAGEIOLATCH_EX等待事件的相关资料做一个简单的归纳.整理.关于PAGEIOLATCH_EX,官方文档的简单介绍如下: PAGEIO ...

  8. sql server 各种等待类型-转

    等待的类型 资源等待 当某个工作线程请求访问某个不可用的资源(因为该资源正在由其他某个工作线程使用,或者该资源尚不可用)时,便会发生资源等待.资源等待的示例包括锁等待.闩锁等待.网络等待以及磁盘 I/ ...

  9. sql server 性能调优之 资源等待PAGELATCH

    一.概述 在前几章介绍过 sql server 性能调优资源等待之PAGEIOLATCH,PAGEIOLATCH是出现在sql server要和磁盘作交互的时候,所以加个IO两个字.这次来介绍PAGE ...

随机推荐

  1. Jquery的一些常见用法

    谨以此文怀念我们大学的时光,Jquery3.4.0下载 https://code.jquery.com/jquery-3.4.0.min.js ⒈常用方法 $("#div1").h ...

  2. SpringSecurityOAuth使用JWT Token

    ⒈JWT? JWT(Json Web Token),是Json的一个开放的Token标准. 1,自包含,SpringSecurityOAuth的默认Token是UUID的一个随机的无意义的字符串,并不 ...

  3. SSH命令行管理文件

    1.从服务器上下载文件 ssh root@13.111.122.133 2.从服务器上下载文件 scp username@servername:/path/filename /var/www/loca ...

  4. linux驱动 之 module_init解析 (上)【转】

    转自:https://blog.csdn.net/Richard_LiuJH/article/details/45669207 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  5. css利用padding百分比实现图片自适应高度

    应用场景 宽高比率,实现图片自适应高度,防止图片加载过程高度为0,加载完图片高度撑起,它下面的div抖动问题 重点:CSS百分比padding都是相对宽度计算的 <div class=" ...

  6. 洛谷 P4948 拉格朗日多项式插值(杜老师板子)

    https://www.luogu.org/problemnew/show/P4948 这篇博客主要目的是存一下的dls的神奇板子,本来应该是推公式或者二分做的 但是dls的插值板子直接写好了这个特殊 ...

  7. <TCP/IP>记一次关于IP地址和MAC物理地址的思考

    是的,从3月6日第一次上计算机网络课起,我还是今天第一次对这本书里讲的知识点有了自己的疑问..之前看书就是 嗯嗯这好像很有道理,嗯嗯也许再多看几章就知道它在讲什么了.. 不过今天已经自学到了网络层了, ...

  8. Linux Free命令每个数字的含义 和 cache 、buffer的区别

    Linux Free命令每个数字的含义 和 cache .buffer的区别 我们按照图中来一细细研读(数字编号和图对应)1,total:物理内存实际总量2,used:这块千万注意,这里可不是实际已经 ...

  9. 分布式全文检索引擎之ElasticSearch

    一 什么是 ElasticSearch Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elas ...

  10. python-进程池与线程池,协程

    一.进程池与线程池 实现并发的手段有两种,多线程和多进程.注:并发是指多个任务看起来是同时运行的.主要是切换+保存状态. 当我们需要执行的并发任务大于cpu的核数时,我们需要知道一个操作系统不能无限的 ...