AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 21342
Accepted
marc_s
marc_s
Asked: 2012-07-24 10:39:31 +0800 CST2012-07-24 10:39:31 +0800 CST 2012-07-24 10:39:31 +0800 CST

处理 CXPACKET 等待 - 设置并行成本阈值

  • 772

作为我之前关于对 Sharepoint 站点进行性能故障排除的问题的后续,我想知道是否可以对 CXPACKET 等待做些什么。

我知道下意识的解决方案是通过将 MAXDOP 设置为 1 来关闭所有并行性 - 听起来是个坏主意。但另一个想法是在并行性开始之前提高成本阈值。执行计划成本的默认值 5 相当低。

所以我想知道是否已经编写了一个查询,可以找到执行计划成本最高的查询(我知道您可以找到执行时间最长的查询等等 - 但是执行计划成本是否可以在某处检索,也是?),这也会告诉我这样的查询是否已并行执行。

有没有人手头有这样的脚本,或者可以指出相关 DMV、DMF 或其他系统目录视图的方向来找出这个?

sql-server-2008 performance
  • 4 4 个回答
  • 3082 Views

4 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-07-24T11:54:32+08:002012-07-24T11:54:32+08:00

    CXPACKET从来都不是原因;它受到了所有的责备,但它总是其他事情的症状。您需要在行动中捕捉这些查询并弄清楚“其他东西”是什么。它可能因查询而异,并且完全关闭并行性 - 正如您所建议的那样 - 在大多数情况下是不必要的过度杀伤。但它通常是最少的工作量,这就是为什么它是如此普遍的“修复”。

    如果您可以获得似乎导致高 CXPACKET 等待的查询的实际计划,请将其加载到SentryOne Plan Explorer中。这通常是有原因的。我们展示了哪些并行操作导致了线程倾斜,您可以轻松地将其与关闭的估计相关联(我们突出显示估计至少偏离某个阈值的操作)。通常,潜在的问题是非常糟糕/过时(或不可用)的统计数据。

    不幸的是,您会在 sys.dm_exec_cached_plans 中找到估计的计划。他们不会告诉您计划在实际使用时是否并行,因为实际计划不是缓存的内容。在某些情况下,您希望看到同一查询的串行和并行计划;这不是 SQL Server 处理可能在运行时并行的并行计划情况的方式。(这里有很多关于这方面的信息。)

    • 11
  2. Zane
    2012-07-26T12:33:38+08:002012-07-26T12:33:38+08:00

    如果您希望查看正在运行的查询的实际执行计划。

    SELECT plan_handle FROM sys.dm_exec_requests WHERE session_id = [YourSPID]
    

    首先,然后将结果输入到此查询中。

    SELECT query_plan FROM sys.dm_exec_query_plan (Enter the result here.)
    

    这将向您显示 sql 用于该查询的实际执行计划。您可以使用该执行计划来查看您正在等待哪个线程。

    我还发现关闭超线程大大减少了我的 CXpacket 等待时间。

    希望有帮助。

    • 4
  3. tacotuesday
    2012-07-24T14:31:43+08:002012-07-24T14:31:43+08:00

    Aaron 的上述回答是正确的。

    我想补充一点,如果您还没有使用SQL Performance Dashboard Reports和内置的Data Collector,那么您应该开始。

    您还可以使用以下查询,并根据需要对其进行修改:

    DECLARE @MinExecutions int; 
    SET @MinExecutions = 5 
    
    SELECT EQS.total_worker_time AS TotalWorkerTime 
          ,EQS.total_logical_reads + EQS.total_logical_writes AS TotalLogicalIO 
          ,EQS.execution_count As ExeCnt 
          ,EQS.last_execution_time AS LastUsage 
          ,EQS.total_worker_time / EQS.execution_count as AvgCPUTimeMiS 
          ,(EQS.total_logical_reads + EQS.total_logical_writes) / EQS.execution_count  
           AS AvgLogicalIO 
          ,DB.name AS DatabaseName 
          ,SUBSTRING(EST.text 
                    ,1 + EQS.statement_start_offset / 2 
                    ,(CASE WHEN EQS.statement_end_offset = -1  
                           THEN LEN(convert(nvarchar(max), EST.text)) * 2  
                           ELSE EQS.statement_end_offset END  
                     - EQS.statement_start_offset) / 2 
                    ) AS SqlStatement 
          -- Optional with Query plan; remove comment to show, but then the query takes !!much longer!! 
          --,EQP.[query_plan] AS [QueryPlan] 
    FROM sys.dm_exec_query_stats AS EQS 
         CROSS APPLY sys.dm_exec_sql_text(EQS.sql_handle) AS EST 
         CROSS APPLY sys.dm_exec_query_plan(EQS.plan_handle) AS EQP 
         LEFT JOIN sys.databases AS DB 
             ON EST.dbid = DB.database_id      
    WHERE EQS.execution_count > @MinExecutions 
          AND EQS.last_execution_time > DATEDIFF(MONTH, -1, GETDATE()) 
    ORDER BY AvgLogicalIo DESC 
            ,AvgCPUTimeMiS DESC
    
    • 3
  4. LCJ
    2016-09-23T12:59:54+08:002016-09-23T12:59:54+08:00

    在我之前的经验中,并行的成本阈值无助于减少 CXPACKET。

    由于不正确的统计数据会导致高CXPACKET等待,从而导致偏斜并行。

    1. 更多关于 CXPACKET 等待:倾斜的并行性
    2. Microsoft Connect 项目
    3. 我的查询是(不)因为并行而等待?——蒂姆·福特

    以下是我用来查找包含CXPacket和“其他等待”的会话的 SQL(请参阅下面的图表)。

    SQL

    DECLARE @RawResult TABLE ([database_id] INT,[session_id] INT,exec_context_id INT, [blocking_session_id] INT,task_state VARCHAR(20),
                              [cpu_time] BIGINT,[wait_duration_ms] BIGINT, [wait_type] VARCHAR(100),[resource_description] nvarchar(3072),
                              [sql_handle] varbinary(64),[plan_handle] varbinary(64)
                              )
    INSERT INTO @RawResult
    SELECT 
        [R].[database_id],
        [S].[session_id],
        [W].exec_context_id,
        [W].blocking_session_id,
        [T].task_state,
        [R].[cpu_time],
        [W].[wait_duration_ms],
        [W].[wait_type],
        [W].[resource_description],
        [R].[sql_handle],
        [R].[plan_handle]
    FROM sys.dm_os_waiting_tasks [W]
    INNER JOIN sys.dm_os_tasks [T] ON
        [W].[waiting_task_address] = [T].[task_address]
    INNER JOIN sys.dm_exec_sessions [S] ON
        [W].[session_id] = [S].[session_id]
    INNER JOIN sys.dm_exec_requests [R] ON
        [S].[session_id] = [R].[session_id]
    WHERE [S].[is_user_process] = 1
    --AND S.session_id <> @@SPID--???
    --ORDER BY [W].[session_id],[W].[exec_context_id];
    
    
    SELECT  
        DB_NAME(C.database_id) AS database_name,
        C.[database_id],
        C.[session_id],
        C.exec_context_id,
        C.blocking_session_id,
        C.task_state,
        C.[cpu_time],
        C.[wait_duration_ms],
        C.[wait_type],
        C.[sql_handle],
        C.[plan_handle],
        [H].text,
        [P].[query_plan],
        C.[resource_description]
    FROM @RawResult C
    OUTER APPLY sys.dm_exec_sql_text (C.[sql_handle]) [H]
    OUTER APPLY sys.dm_exec_query_plan (C.[plan_handle]) [P]
    WHERE C.[session_id] IN
                        (
                            SELECT A.[session_id]
                            FROM @RawResult A
                            INNER JOIN @RawResult B
                                ON A.[session_id] = B.[session_id]
                                AND A.wait_type='CXPACKET'
                                AND B.wait_type <> 'CXPACKET'
                        )
    ORDER BY C.[session_id],C.[exec_context_id]
    

    在此处输入图像描述

    大型扫描也可能是根本原因的一部分。当我从上述查询中检查执行计划时,我在我的数据库中发现了一个这样的扫描。执行计划中还缺少索引建议。

    在此处输入图像描述


    • 0

相关问题

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve