AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

Lidando com esperas CXPACKET - definindo limite de custo para paralelismo

  • 772

Como acompanhamento da minha pergunta anterior sobre solução de problemas de perf em um site do Sharepoint , gostaria de saber se poderia fazer algo sobre as esperas do CXPACKET.

Eu sei que a solução instintiva é desligar todo o paralelismo definindo MAXDOP como 1 - parece uma má ideia. Mas outra ideia é aumentar o limite de custo antes que o paralelismo entre em ação. O padrão de 5 para o custo de um plano de execução é razoavelmente baixo.

Então, eu queria saber se há uma consulta já escrita que encontraria as consultas com o maior custo do plano de execução (eu sei que você pode encontrar aquelas com a maior duração de execução e assim por diante - mas o custo do plano de execução pode ser recuperado em algum lugar, também?) e isso também me diria se tal consulta foi executada em paralelo.

Alguém tem esse script em mãos ou pode me indicar a direção do DMV, DMF ou outras exibições de catálogo do sistema relevantes para descobrir isso?

sql-server-2008 performance
  • 4 4 respostas
  • 3082 Views

4 respostas

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

    CXPACKETnunca é uma causa; leva toda a culpa, mas é sempre um sintoma de outra coisa. Você precisa pegar essas perguntas no ato e descobrir o que é "algo mais". Pode ser diferente de consulta para consulta, e desligar completamente o paralelismo é - como você sugeriu - um exagero desnecessário na maioria dos casos. Mas geralmente é a menor quantidade de trabalho, e é por isso que é um "conserto" tão comum.

    Se você puder obter um plano real para uma consulta que parece ser responsável por altas esperas de CXPACKET, carregue-o no SentryOne Plan Explorer . Geralmente há uma razão por trás disso; mostramos quais operações paralelas levaram à distorção de encadeamento e você pode facilmente correlacionar isso com estimativas que estão erradas (destacamos operações com estimativas que estão erradas em pelo menos um determinado limite). Normalmente, o problema subjacente são estatísticas muito ruins/desatualizadas (ou indisponíveis).

    Infelizmente, o que você encontrará em sys.dm_exec_cached_plans são planos estimados . Eles não dirão se o plano foi paralelo quando foi realmente usado, porque o plano real não é o que está armazenado em cache. Em alguns casos, você espera ver um plano serial e paralelo para a mesma consulta; não é assim que o SQL Server lida com a situação de planos paralelos que podem ser paralelos em tempo de execução. ( Muitas informações sobre isso aqui .)

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

    Se você deseja ver o plano de execução real de uma consulta em execução.

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

    Primeiro insira o resultado nesta consulta.

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

    Isso mostrará o plano de execução real que o sql usou para essa consulta. Você pode usar esse plano de execução para ver qual thread está esperando.

    Também descobri que desativar o hyper threading reduziu drasticamente meus tempos de espera do CXpacket.

    Espero que ajude.

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

    A resposta acima de Aaron está correta.

    Gostaria apenas de acrescentar que, se você ainda não estiver usando o SQL Performance Dashboard Reports e o Data Collector integrado , você deve começar.

    Você também pode pegar a seguinte consulta e modificá-la como achar melhor:

    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

    Em minha experiência anterior, o limite de custo para paralelismo não ajudou a reduzir o CXPACKET.

    A espera alta CXPACKETpode ocorrer devido a estatísticas incorretas, resultando em paralelismo distorcido.

    1. Mais sobre esperas CXPACKET: paralelismo enviesado
    2. Item do Microsoft Connect
    3. Minha consulta está (não) esperando por causa do paralelismo? -Tim Ford

    A seguir está o SQL que usei para encontrar sessões que possuem CXPacket e " outras esperas " (consulte o diagrama abaixo).

    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]
    

    insira a descrição da imagem aqui

    Varreduras grandes também podem ser parte da causa raiz. Quando verifiquei o plano de execução da consulta acima, encontrei uma dessas varreduras em meu banco de dados. Havia também uma sugestão de índice ausente no plano de execução.

    insira a descrição da imagem aqui


    • 0

relate perguntas

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve