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 / 329931
Accepted
Sranda
Sranda
Asked: 2023-08-03 16:31:15 +0800 CST2023-08-03 16:31:15 +0800 CST 2023-08-03 16:31:15 +0800 CST

Contenção TempDB GAM para consultas SELECT

  • 772

Eu tenho um problema que se manifesta da seguinte maneira, meu conhecimento do TempDB não cobre isso (ainda):

  • Uma consulta analítica, que roda no SSMS por cerca de 200ms, continua rodando no servidor SQL, quando iniciada a partir do aplicativo, por mais de 60 segundos - isso acontece apenas ocasionalmente, na maioria das vezes o problema não está presente
  • A fila de consultas executáveis/suspensas pode crescer até dezenas de consultas do mesmo texto de consulta, sendo uma delas consultas SELECT um bloqueador de cabeça bloqueando outros SELECTs idênticos
  • as esperas mais dominantes são SOS_SCHEDULER_YIELD e PAGELATCH_UP para as consultas específicas do mesmo texto e valores de parâmetro, quando as filas executáveis/suspensas começam a crescer significativamente em comparação com a linha de base
  • quando o problema ocorre, as dezenas de consultas na fila têm os mesmos valores literais de parâmetros (timestamp de início de turno, id de funcionário e área de produção)
  • as queries que estão sendo suspensas (durante o tempo do snapshot do nosso monitoramento - DBA Dash) têm a espera PAGELATCH_UP como a mais dominante e estão esperando a página GAM em tempdb
  • a consulta não está vazando para o tempdb quando verifico o plano de execução no SSMS, usando os parâmetros da consulta que continua se acumulando nas filas executáveis/suspensas

Configuração do servidor, do banco de dados e do tráfego do banco de dados:

  • 4 a 6 núcleos (o problema ocorreu independentemente em dois servidores diferentes com contagem de núcleo diferente)
  • 4 - 6 arquivos TempDB de tamanho uniforme
  • 40 GB de RAM atribuídos à instância
  • no banco de dados específico, o RCSI + Snapshot está ativado (portanto, o TempDB está sendo atingido)
  • nenhuma exclusão está ocorrendo nas duas tabelas nas quais a consulta é executada, apenas INSERTs e SELECTs - apenas 1 linha por vez é inserida
  • SELECTs estão atingindo geralmente os registros mais novos (aqueles inseridos recentemente)
  • o servidor está fazendo geralmente 400 - 700 solicitações em lote/s; Quando ocorre o problema, atinge um pico de até 1500, criando alta carga de E/S + CPU em comparação com a operação normal
  • os dados na tabela têm distribuição mais ou menos uniforme, ou seja, nenhum funcionário em nenhum turno para determinada área de produção tem significativamente mais registros do que os outros
  • a captura de tela em anexo é uma tabela que mostra o instantâneo do DBA Dash em um momento em que o problema se manifesta totalmente
  • tempDB, apesar do snapshot RCSI+ não crescer muito, são alguns GBs em um drive de 60GB (status estável por vários meses e depois de alguns episódios do que descrevo aqui)
  • todas as consultas SELECT na captura de tela têm espera PAGELATCH_UP, aproximadamente metade delas tem as seguintes informações adicionais:
    • tipo de recurso de espera: PAGE
    • recurso de espera: 2:3:2 (acho que o significado é: banco de dados tempdb, 3º arquivo em tempdb, 2ª página que estamos esperando)
    • arquivo de espera: PRIMÁRIO | temp2
    • tipo de página: GAM
    • Esperar para compilar: Falso

Além do esforço óbvio para chegar à causa raiz e corrigi-la permanentemente, minhas principais perguntas seriam:

  • como é que as consultas SELECT podem acessar páginas GAM pesadamente em tempdb?
  • se eu admitir que SELECT pode tocar na página GAM com frequência, o que pode impedir o progresso da consulta (bloqueador de cabeça) (ou seja, ler a página GAM e disponibilizá-la imediatamente para outras pessoas)?

Apontar para qualquer recurso / conselho de estudo relevante seria muito apreciado

plano de consulta aqui

Instantâneo de consultas em execução do DBADash

EDIT: Para responder ao comentário de John, gostaria de acrescentar o seguinte:

  • CTFP: 30
  • MAXDOP: 4 (definido para ambos os servidores SQL, embora um tenha 6 núcleos, o outro tenha 4)
  • existem 2 instâncias por SQL VM - esta instância em que ocorreu o problema, depois outra instância de "escritório", que coloca uma carga insignificante na VM do servidor SQL
  • Tabelas

ManualPanelEntries : 6933089 registros, 1221 MB de dados, 2591 MB de índices - de fato, os índices consomem mais espaço do que os próprios dados

Pesos : 3108486 registros, 178 MB de dados, 170 MB de índices

  • Todo o banco de dados: 125 GB

============

O que descobri depois de escrever a postagem é que também o bloqueador de cabeça (um dos muitos SELECTs paralelos idênticos) espera pelo GAM, segunda página de um arquivo tempdb específico. Como se algo mais (armazenamento de versão?) Bloqueasse uma página GAM específica, impedindo que outras consultas usando o TempDB continuassem.

sql-server-2019
  • 2 2 respostas
  • 129 Views

2 respostas

  • Voted
  1. Best Answer
    Paul White
    2023-08-03T21:38:22+08:002023-08-03T21:38:22+08:00

    O cerne do seu problema é coberto pela documentação em Recomendações para reduzir a contenção de alocação no banco de dados tempdb do SQL Server . Você está executando o SQL Server 2019, o que significa que verá a contenção nas páginas GAM em vez de SGAM.

    Suas operações de classificação e hash podem não estar derramando (embora várias consultas em sua captura de tela mostrem gravações ), mas o SQL Server ainda precisa alocar estruturas (arquivos de trabalho e tabelas de trabalho) para oferecer suporte à classificação e hash, algumas das quais são necessárias caso haja um derrame em tempo de execução. Se você fizer o suficiente dessas operações com rapidez suficiente, poderá ver a contenção de trava de página GAM.

    As esperas de trinco geralmente são curtas, mas é possível encontrar comboios de trinco , resultando em esperas (muito) mais longas ocasionalmente.

    Conforme observado na documentação vinculada acima, a solução principal é adicionar arquivos ao tempdb até que a contenção desapareça ou seja reduzida a um nível aceitável.

    Provavelmente não relacionado ao problema específico aqui, você também tem a opção de habilitar metadados com otimização de memória para tempdb no SQL Server 2019. Essa opção tem suas desvantagens e foi objeto de alguns bugs.

    O SQL Server 2022 apresenta atualizações simultâneas de GAM e SGAM , que substituem a necessidade de uma UPtrava (atualização) por uma SHtrava (compartilhada). Isso reduz consideravelmente o escopo para problemas dessa natureza.

    • 7
  2. David Wiseman
    2023-08-03T17:31:18+08:002023-08-03T17:31:18+08:00

    As consultas de seleção geralmente não bloqueiam outras seleções. Eu suspeito que eles podem estar esperando por bloqueios de compilação.

    Se você estiver obtendo muitas consultas em execução ao mesmo tempo com os mesmos valores de parâmetro, pode ser um problema que pode ser corrigido no lado do aplicativo. Use cache. Verifique se não há problemas com o código que fazem com que as consultas sejam executadas com mais frequência do que o necessário. Por exemplo, chamando dentro de um loop em vez de fora.

    Como você está vendo a contenção do tempdb GAM, minha primeira resposta seria verificar se estou em um nível de patch recente. Houve melhorias significativas para ajudar na contenção de tempdb em várias CUs. Em seguida, procuraria dobrar os arquivos temporários do banco de dados. Se você tiver 6 núcleos com 6 arquivos, dobre para 12. Pode estar fora das diretrizes padrão para o número de arquivos tempdb, mas se você estiver vendo contenção de GAM de tempdb, mais arquivos ajudarão.

    Eu criei o DBA Dash. Espero que você esteja achando útil ?

    • 2

relate perguntas

  • O período de avaliação do SQL Server expirou

  • Como o novo procedimento armazenado do sistema sys.xp_delete_files é diferente de sys.xp_delete_file?

  • Atualizando do SQL Server 2012 SP1 para o SQL Server 2019

  • O MS SQL Server tem a função generate_series

  • Como você habilita o cache do conjunto de resultados do SQL Server 2019?

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