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 / 237509
Accepted
John Eisbrener
John Eisbrener
Asked: 2019-05-07 12:48:28 +0800 CST2019-05-07 12:48:28 +0800 CST 2019-05-07 12:48:28 +0800 CST

A exibição de um Plano de Execução Estimado gera esperas CXPACKET, PAGELATCH_SH e LATCH_EX [ACCESS_METHODS_DATASET_PARENT]

  • 772

Estou executando o Microsoft SQL Server 2016 SP2-CU6 (13.0.5292.0) em uma VM de 4 vCPU com max degree of parallelismdefinido como 2e cost threshold for parallelismdefinido como 50.

De manhã, ao tentar exibir um Plano de Execução Estimado para uma consulta SELECT TOP 100, tenho grandes esperas e a operação para renderizar o plano estimado leva minutos, geralmente na faixa de 5 a 7 minutos. Novamente, esta não é a execução real da consulta, este é apenas o processo para exibir um Plano de Execução Estimado .

sp_WhoIsActivemostrará PAGEIOLATCH_SHesperas ou LATCH_EX [ACCESS_METHODS_DATASET_PARENT]esperas e quando executo o script WaitingTasks.sql de Paul Randal durante a operação, ele mostra CXPACKETesperas com os threads de trabalho mostrando PAGEIOLATCH_SHesperas:

insira a descrição da imagem aqui

*campo de descrição do recurso =exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen

Os threads de trabalho parecem estar trazendo a statstabela inteira para a memória (como os números de página, bem como os números de página subsequentes mostrados do ponto de consulta de Paul Randal de volta à chave agrupada da statstabela). Uma vez que o plano volta, é basicamente instantâneo pelo resto do dia, mesmo depois de ver a maior parte do statsatrito da tabela do cache com apenas vários registros restantes (que suponho que foram puxados devido a operações de busca de consultas semelhantes).

Eu esperaria esse comportamento inicial se a consulta estivesse realmente sendo executada com um plano que usasse operadores SCAN, mas por que está fazendo isso ao avaliar planos de execução apenas para chegar a um operador SEEK, conforme mostrado no plano vinculado acima? O que posso fazer (além de executar esta declaração antes do horário comercial para que meus dados sejam armazenados em cache adequadamente) para ajudar a melhorar o desempenho aqui? Estou assumindo que um par de índices de cobertura seria benéfico, mas eles realmente garantiriam alguma mudança no comportamento? Eu tenho que trabalhar com algumas limitações da janela de armazenamento e manutenção aqui, e a consulta em si é gerada a partir de uma solução de fornecedor, portanto, quaisquer outras sugestões (além de uma melhor indexação) seriam bem-vindas neste momento.

sql-server performance
  • 2 2 respostas
  • 915 Views

2 respostas

  • Voted
  1. Best Answer
    Josh Darnell
    2019-05-07T13:33:35+08:002019-05-07T13:33:35+08:00

    Parece que sua solicitação de um plano de execução real acionou atualizações de estatísticas. Como você mencionou que isso acontece de manhã, imagino que haja um processo noturno que faça muitas modificações nas tabelas envolvidas?

    Assim, o SQL Server usa as estatísticas para criar o plano, atingiu o limite de modificação e executa atualizações automáticas de estatísticas como parte da operação.

    No XML do plano estimado que você compartilhou, vejo essas datas de atualização próximas das estatísticas desta manhã:

    LastUpdate="2019-05-06T09:12:49.92"
    LastUpdate="2019-05-06T09:12:58.3"
    LastUpdate="2019-05-06T09:13:20.33"
    LastUpdate="2019-05-06T09:13:09.67"
    LastUpdate="2019-05-06T09:12:59.05"
    LastUpdate="2019-05-06T09:12:39.56"
    

    Se estas são tabelas muito grandes e ocupadas (parece provável com base nas porcentagens de amostragem), não é muito surpreendente que as atualizações de estatísticas estejam consumindo muita potência.

    • 13
  2. Joe Obbish
    2019-05-07T15:29:10+08:002019-05-07T15:29:10+08:00

    Quando vejo longos tempos de planejamento estimados no SSMS, é um dos seguintes em ordem de probabilidade:

    1. O otimizador de consulta decidiu que precisava criar ou atualizar estatísticas.
    2. O tamanho do plano estimado é muito grande (digamos, >10 MB) e o SSMS simplesmente leva muito tempo para exibi-lo.
    3. A compilação da consulta em si realmente levou muito tempo devido ao uso da CPU na procura de um plano bom o suficiente.
    4. O servidor está sob extrema pressão. Por exemplo, talvez eu tenha que esperar que um gateway fique disponível.
    5. Vários bugs que levam a tempos de compilação extremamente longos.

    Para sua situação, a resposta é quase certamente que o SQL Server está atualizando ou criando estatísticas. Existem algumas pistas: o tamanho do plano de consulta é pequeno, o plano de consulta é relativamente simples com baixo custo e a CPU de compilação é significativamente menor que o tempo de compilação:

    insira a descrição da imagem aqui

    O novo colaborador Josh Darnell também apontou uma boa pista com a última hora atualizada das estatísticas no XML.

    O SQL Server 2019 apresenta um novo tipo de espera, WAIT_ON_SYNC_STATISTICS_REFRESH , para quando as consultas estiverem aguardando atualizações de estatísticas. É muito mais fácil diagnosticar esse problema nessa versão. Até lá, você só terá que confiar em técnicas indiretas.

    As soluções alternativas incluem atualizar as estatísticas durante um período de manutenção ou habilitar a atualização automática de estatísticas assíncronas para o banco de dados. Por favor, entenda todas as ramificações dessa opção antes de alterá-la. Os planos de consulta serão criados antes das estatísticas serem atualizadas em vez de após as atualizações das estatísticas. Para algumas cargas de trabalho, isso pode ser uma grande vitória. Para outros, pode fazer mais mal do que bem.

    • 9

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

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

  • 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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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
    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

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