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 / 40459
Accepted
Paul Williams
Paul Williams
Asked: 2013-04-20 07:43:40 +0800 CST2013-04-20 07:43:40 +0800 CST 2013-04-20 07:43:40 +0800 CST

LATCH_EX espera no recurso METADATA_SEQUENCE_GENERATOR

  • 772

Temos um processo que gera um relatório de inventário. No lado do cliente, o processo se divide em um número configurável de threads de trabalho para criar um bloco de dados para o relatório que corresponde a um armazenamento entre muitos (potencialmente milhares, geralmente dezenas). Cada thread de trabalho chama um serviço da Web que executa um procedimento armazenado.

O processo de banco de dados para processar cada bloco reúne um monte de dados em uma tabela #Temporary. No final de cada bloco de processamento, os dados são gravados em uma tabela permanente em tempdb. Por fim, ao final do processo, um thread do lado do cliente solicita todos os dados da tabela tempdb permanente.

Quanto mais usuários executam esse relatório, mais lento ele fica. Analisei a atividade no banco de dados. A certa altura, vi 35 solicitações separadas, todas bloqueadas em um ponto do processo. Todos esses SPIDs tiveram esperas da ordem de 50 ms do tipo LATCH_EXno recurso METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8). Um SPID tem esse recurso e todos os outros estão bloqueando. Não encontrei nada sobre esse recurso de espera em uma pesquisa na web.

A tabela em tempdb que estamos usando tem uma IDENTITY(1,1)coluna. Esses SPIDs estão aguardando a coluna IDENTITY? Que métodos poderíamos usar para reduzir ou eliminar o bloqueio?

O servidor faz parte de um cluster. O servidor está executando o SQL Server 2012 Standard Edition SP1 de 64 bits no Windows 2008 R2 Enterprise de 64 bits. O servidor tem 64 GB de RAM e 48 processadores, mas o banco de dados só pode usar 16 por ser a edição padrão.

(Observe que não estou entusiasmado com o design de usar uma tabela permanente em tempdb para armazenar todos esses dados. Mudar isso seria um desafio técnico e político interessante, mas estou aberto a sugestões.)

ATUALIZAÇÃO 23/04/2013

Abrimos um caso de suporte com a Microsoft. Manterei esta pergunta atualizada à medida que aprendermos mais.

ATUALIZAÇÃO 10/05/2013

O engenheiro de suporte do SQL Server concordou que as esperas foram causadas pela coluna IDENTITY. A remoção da IDENTIDADE eliminou as esperas. Não foi possível duplicar o problema no SQL 2008 R2; ocorreu apenas no SQL 2012.

sql-server sql-server-2012
  • 2 2 respostas
  • 3567 Views

2 respostas

  • Voted
  1. Rachel Ambler
    2019-01-01T08:17:44+08:002019-01-01T08:17:44+08:00

    (Atualizado em fevereiro de 2019)

    Este é um post antigo, que dizia que finalmente consegui convencer a Microsoft de que o próprio fato de isso acontecer é realmente um defeito.

    Atualização: MS confirmou o defeito e atribuiu a ele um número de bug de 12628722.

    Eu tinha visto esta postagem em novembro de 2018, quando começamos a sofrer da mesma forma depois de atualizarmos do Sql Server 2005 para o Sql Server 2017. Uma tabela de 3,3 milhões de linhas que costumava levar 10 segundos para inserir em massa de repente começou a levar 10 minutos em tabelas com Identitycolunas.

    Acontece que há dois problemas por trás disso:

    1. A Microsoft alterou o comportamento no Sql Server 2014 para forçar as inserções em massa a serem executadas em paralelo - nas versões anteriores, as inserções em massa recebiam um plano serializado.
    2. Depois de rodar em paralelo em nossa caixa de 32 núcleos, o mecanismo passou mais tempo com os núcleos travando um ao outro do que realmente fazendo o trabalho.

    Levei 4 semanas, mas logo após as férias recebi um presente atrasado do Papai Noel - a confirmação de que o problema era realmente um defeito.

    Existem algumas soluções possíveis que encontramos até que isso seja corrigido:

    1. Use Option (MaxDop 1)na consulta para transformar a inserção em massa de volta em um plano serializado.
    2. Mascare a coluna Identity lançando-a (por exemplo, Select Cast(MyIdentityColumn As Integer) As MyIdentityColumn)
      • isso evita que a propriedade de identidade seja copiada ao usarSELECT...INTO
    3. Remova a coluna de identidade conforme descrito acima.
    4. Altere o modo de compatibilidade do banco de dados para Sql Server 2012 ou inferior para restabelecer um plano serializado.

    Atualização: a correção que a MS implementará será retornar esses tipos de inserções de volta ao uso de um Serialized plano. Isso está planejado para o Sql Server 2017 CU14 (sem novidades em outras versões do Sql Server - desculpe!). Quando implementado, o Trace Flag 9492 precisará ser ativado, no nível do servidor ou via DBCC TraceOn .

    • 7
  2. Best Answer
    Jon Seigel
    2013-04-20T09:31:58+08:002013-04-20T09:31:58+08:00

    Supondo que você possa isolar o problema para a geração de valores de identidade (tente remover essa coluna como teste), o que eu recomendaria é o seguinte:

    1. Remova a IDENTITYpropriedade da coluna na tabela final.
    2. Gere valores de identidade em cada uma das #Tabelas temporárias.
    3. Ao carregar a tabela final, combine um identificador numérico para a loja específica com os valores de identidade da etapa 2.

    Portanto, se você tiver os IDs de loja 3 e 4, acabará com os valores de id finais como este:

    3000000001
    3000000002
    3000000003
    ...
    4000000001
    4000000002
    ...
    

    Ou algo parecido com isso. Você entendeu a ideia.

    Isso eliminará a necessidade de serializar na IDENTITYgeração, preservando a exclusividade no resultado final.

    Como alternativa, dependendo de como o processo funciona, insira os valores de id calculados finais nas #Tabelas temporárias. Em seguida, você pode criar uma exibição que UNION ALLos reúna, eliminando a necessidade de copiar os dados.

    • 4

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

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

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

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • 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

    Conceder acesso a todas as tabelas para um usuário

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

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