需要帮助解决生产数据库中的SQL Server等待事件故障 [英] Needs help in Troubleshooting SQL server wait event in production database

查看:127
本文介绍了需要帮助解决生产数据库中的SQL Server等待事件故障的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

亲爱的所有人,


我是SQL服务器性能调优问题的新手。对于新构建的SQL服务器之一(SQL Server 2016标准版),我们遇到了很多缓慢的问题。报告的主要等待事件是LATCH_EX  &安培;  CXPACKET群组。我改变了"成本
并行阈值"。例如10,但这确实使情况变得更糟。我经历了保罗关于这些等待事件的所有优秀文章,但仍然无法如何继续下去。


我们也没有微软的支持也帮助我,我是孤独的dba对于我的组织。


任何输入/建议都将受到高度赞赏。 


最诚挚的问候,


Sandy

解决方案

首先,改变这是一件好事  " Parallel Threshold for Parallelism"但是设置 它到 25
至少。 


你能告诉我们吗?此查询的输出?


; WITH Waits AS



  SELECT  ; $
   wait_type,

   wait_time_ms  / 1000.AS wait_time_s, 

     ;   100 * wait_time_ms / SUM(wait_time_ms)OVER()AS PCT,

      ROW_NUMBER()OVER(ORDER BY wait_time_ms DESC)用作Rn

    FROM sys.dm_os_wait_stats

    WHERE wait_type NOT IN(N'CLR_SEMAPHORE 'N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', &NBSP ; N'LAZYWRITER_SLEEP',

     N'RESOURCE_QUEUE',   N'SQLTRACE_BUFFER_FLUSH',

     N'SLEEP_TASK",        N'SLEEP_SYSTEMTASK',

        N'WAITFOR",          N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',

        N'CHECKPOINT_QUEUE',N'REQUEST_FOR_DEADLOCK_SEARCH',

        N'XE_TIMER_EVENT",    N'XE_DISPATCHER_JOIN',

        N'LOGMGR_QUEUE",      N'FT_IFTS_SCHEDULER_IDLE_WAIT',

        N'BROKER_TASK_STOP',N'CLR_MANUAL_EVENT',

        N'CLR_AUTO_EVENT",    N'DISPATCHER_QUEUE_SEMAPHORE',

        N'TRACEWRITE",        N'XE_DISPATCHER_WAIT',

        N'BROKER_TO_FLUSH",  N'BROKER_EVENTHANDLER',

        N'FT_IFTSHC_MUTEX",  N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',

        N'DIRTY_PAGE_POLL",  N'SP_SERVER_DIAGNOSTICS_SLEEP '

N'ONDEMAND_TASK_QUEUE',N'BROKER_RECEIVE_WAITFOR 'N'QDS_ASYNC_QUEUE'



)b
      - 过滤掉额外的无关等待

,cte1

AS



SELECT 

  W1.wait_type,

  CAST(W1.wait_time_s AS DECIMAL(12,2))AS wait_time_s,

  CAST(W1.pct作为DECIMAL(12,2))AS pct

 ,rn

  --- CAST(SUM(W2.pct)AS DECIMAL(12,2) )AS running_pct

FROM Waits AS W1



  --- JOIN等待AS W2

  ---  ON W2.rn< = W1.rn

GROUP BY W1.rn,W1.wait_type,W1.wait_time_s,W1.pct

--- --HAVING SUM(W2.pct)-W1.pct< 90--百分比阈值

)SELECT * FROM 

(SELECT wait_type,wait_time_s,pct,SUM (PCT)OVER(ORDER BY RN

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP BETWEEN UNBOUNDED PRECEDING

&NBSP ROWS;            AND CURRENT ROW)AS runqty FROM cte1

)AS Der WHERE runqty< 95

订单B. Y runqty;


还运行以下查询以查看哪些查询使用并行性


SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 


$
WITH XMLNAMESPACES   

   (DEFAULT'http://schemas.microsoft.com/sqlserver/2004/07/showplan')  
$
SELECT  

  &NBSP; &NBSP; &NBSP; query_plan AS CompleteQueryPlan, 

  &NBSP; &NBSP; &NBSP; n.value('(@ StatementText)[1]','VARCHAR(4000)')AS StatementText, 

  &NBSP; &NBSP; &NBSP; n.value('(@ StatementOptmLevel)[1]','VARCHAR(25)')AS StatementOptimizationLevel, 

  &NBSP; &NBSP; &NBSP; n.value('(@ StatementSubTreeCost)[1]','VARCHAR(128)')AS StatementSubTreeCost, 

  &NBSP; &NBSP; &NBSP; n.query('。')AS ParallelSubTreeXML,  

  &NBSP; &NBSP; &NBSP; ecp.usecounts, 

  &NBSP; &NBSP; &NBSP; ecp.size_in_bytes&NBSP;

从sys.dm_exec_cached_plans作为ECP&NBSP;

剖面APPLY sys.dm_exec_query_plan两个(plan_handle)AS EQP&NBSP;

剖面APPLY query_plan。 nodes('/ ShowPlanXML / BatchSequence / Batch / Statements / StmtSimple')AS qn(n) 

WHERE  n.query('。')。exists('// RelOp [@ PhysicalOp =" Parallelism"]')= 1 



Dear All,

I am very new to SQL server performance tuning issues . For one of the newly built SQL server(SQL server 2016 Standard Edition) we are getting lot of slowness . Major wait events reported are LATCH_EX  & CXPACKET.  I changed "Cost Threshold for Parallelism" to 10 for the instance but that did make the situation worse. I went through Paul's all excellent write- ups on these wait events but still clueless how to proceed on it.

We don't have support of Microsoft also to assist me and I am lone dba for my organisation .

Any inputs/suggestions will be highly appreciated . 

Best Regards,

Sandy

解决方案

First of all this is a good thing to change "Cost Threshold for Parallelism" but set  it to 25 at least. 

Can you show us the output of this query ?

;WITH Waits AS
(
  SELECT 
    wait_type,
    wait_time_ms  /1000. AS wait_time_s, 
         100. * wait_time_ms / SUM(wait_time_ms)OVER()AS pct,
         ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn
      FROM sys.dm_os_wait_stats
      WHERE wait_type NOT IN (N'CLR_SEMAPHORE', N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP',   N'LAZYWRITER_SLEEP',
        N'RESOURCE_QUEUE',   N'SQLTRACE_BUFFER_FLUSH',
        N'SLEEP_TASK',       N'SLEEP_SYSTEMTASK',
        N'WAITFOR',          N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
        N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH',
        N'XE_TIMER_EVENT',   N'XE_DISPATCHER_JOIN',
        N'LOGMGR_QUEUE',     N'FT_IFTS_SCHEDULER_IDLE_WAIT',
        N'BROKER_TASK_STOP', N'CLR_MANUAL_EVENT',
        N'CLR_AUTO_EVENT',   N'DISPATCHER_QUEUE_SEMAPHORE',
        N'TRACEWRITE',       N'XE_DISPATCHER_WAIT',
        N'BROKER_TO_FLUSH',  N'BROKER_EVENTHANDLER',
        N'FT_IFTSHC_MUTEX',  N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
        N'DIRTY_PAGE_POLL',  N'SP_SERVER_DIAGNOSTICS_SLEEP',
N'ONDEMAND_TASK_QUEUE',N'BROKER_RECEIVE_WAITFOR',N'QDS_ASYNC_QUEUE'
)
)
      --filter out additional irrelevant waits
,cte1
AS
(
SELECT 
  W1.wait_type,
  CAST(W1.wait_time_s AS DECIMAL(12,2))AS wait_time_s,
  CAST(W1.pct AS DECIMAL(12,2))AS pct
  ,rn
 --- CAST(SUM(W2.pct)AS DECIMAL(12,2))AS running_pct
FROM Waits AS W1

 --- JOIN Waits AS W2
  ---  ON W2.rn<= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
-----HAVING SUM(W2.pct)-W1.pct < 90-- percentage threshold
) SELECT * FROM 
( SELECT wait_type,wait_time_s,pct,SUM(pct) OVER(ORDER BY rn
                ROWS BETWEEN UNBOUNDED PRECEDING
                         AND CURRENT ROW) AS runqty FROM cte1
) AS Der WHERE runqty <95
ORDER BY runqty;

Also run the below query to see what queries are using parallelism

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

WITH XMLNAMESPACES   
   (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')  
SELECT  
        query_plan AS CompleteQueryPlan, 
        n.value('(@StatementText)[1]', 'VARCHAR(4000)') AS StatementText, 
        n.value('(@StatementOptmLevel)[1]', 'VARCHAR(25)') AS StatementOptimizationLevel, 
        n.value('(@StatementSubTreeCost)[1]', 'VARCHAR(128)') AS StatementSubTreeCost, 
        n.query('.') AS ParallelSubTreeXML,  
        ecp.usecounts, 
        ecp.size_in_bytes 
FROM sys.dm_exec_cached_plans AS ecp 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS eqp 
CROSS APPLY query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple') AS qn(n) 
WHERE  n.query('.').exist('//RelOp[@PhysicalOp="Parallelism"]') = 1 


这篇关于需要帮助解决生产数据库中的SQL Server等待事件故障的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆