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 / 333439
Accepted
J. Mini
J. Mini
Asked: 2023-11-24 20:52:28 +0800 CST2023-11-24 20:52:28 +0800 CST 2023-11-24 20:52:28 +0800 CST

Eu TABLOCKei uma mesa. Como posso ler isso?

  • 772

Eu TABLOCKeditei uma tabela para poder executar inserções em massa. Como posso lê-lo enquanto ainda está bloqueado?

Em circunstâncias normais, eu consideraria isso obviamente impossível. Felizmente, há um fator-chave que torna as circunstâncias anormais. Nesse caso, não me importo nem um pouco com ACID . A única coisa que me importa é não cancelar a consulta que editou TABLOCKa tabela.

Eu tentei WITH (NOLOCK), mas os sinais sugerem que não funciona. Estou pedindo o impossível?

Só para esclarecer, suponha que eu esteja correndo

INSERT [dbo].[Table1] WITH (TABLOCK)
SELECT * FROM [A_Lot_Of_Rows]

Meu objetivo é consultar Table1enquanto isso é executado.

Estou fazendo inserções em massa e, enquanto elas estão rodando, decidi que quero verificar alguns detalhes. Eu não me importo de qual linha eu recebo esses detalhes.

Cada linha A_Lot_Of_Rowscontém uma data. A_Lot_Of_Rowsé truncado pelo meu procedimento armazenado e é preenchido novamente em lotes baseados em data antes de ser truncado novamente. Ao ler uma linha arbitrária da tabela, posso saber em que lote estou.

sql-server
  • 2 2 respostas
  • 83 Views

2 respostas

  • Voted
  1. Best Answer
    Paul White
    2023-11-25T13:23:41+08:002023-11-25T13:23:41+08:00

    Existem duas possibilidades:

    1. Truncando dentro de uma transação

    Isso se aplica se você estiver truncando a tabela e depois carregando em lotes dentro de uma transação .

    Truncar uma tabela requer um bloqueio de modificação de esquema (Sch-M), que é o tipo de bloqueio mais restritivo . Mesmo a leitura no nível de isolamento de leitura não confirmada (alias enganoso de 'nolock') ou RCSI requer um bloqueio de estabilidade de esquema (Sch-S), que não é compatível com Sch-M.

    Uma dica TABLOCKou TABLOCKXnormalmente não impede a leitura de dados sob isolamento de leitura não confirmada (mas consulte a possibilidade nº 2).

    Trunque a tabela fora da transação de carregamento de dados ou registre seu progresso separadamente e consulte-o.

    É lamentável que o truncamento de uma tabela exija um bloqueio Sch-M, enquanto o equivalente irrestrito DELETEnão, mas é assim que é implementado.

    2. A tabela está agrupada

    Se a tabela tiver um índice clusterizado, há uma diferença importante ao usar um bloqueio de tabela na INSERTinstrução (ou qualquer outra maneira de especificar um bloqueio de tabela no carregamento em massa):

    • Com um bloqueio de tabela e um destino vazio, o SQL Server pode reutilizar o mecanismo de carregamento em massa de heap RowsetBulk, que é essencialmente um índice offline criado nos bastidores. Isso requer um bloqueio Sch-M . Nenhuma leitura simultânea é possível neste caso.
    • Sem um bloqueio de tabela e mesmo que a tabela não esteja vazia, o SQL Server ainda pode usar carregamento em massa e registro mínimo, mas usa o FastLoadContextmecanismo. Isso exige um bloqueio exclusivo ('X') na tabela de destino, mas não Sch-M . Leituras simultâneas sob isolamento de leitura não confirmada ou RCSI são possíveis neste caso.

    O FastLoadContextcaminho registra um pouco mais RowsetBulke pode ser visivelmente mais lento, mas ainda é tecnicamente minimamente registrado e mais eficiente do que uma operação totalmente registrada. Isso tudo pressupõe que seu banco de dados e configuração se qualifiquem para registro mínimo .

    Há outra peculiaridade : FastLoadContextos cálculos realizados pelo SQL Server para verificar se o log mínimo deve ser aplicado não levam em conta quaisquer alterações na cardinalidade da tabela no lote atual (procedimento armazenado no seu caso).

    Isso significa que o SQL Server pode decidir não registrar minimamente porque não percebe que a tabela foi esvaziada pela TRUNCATE TABLEinstrução no mesmo procedimento. Que eu saiba, não há nenhuma solução alternativa específica para isso, além de executar o truncamento em um lote separado.

    Se você conseguir capturar planos de execução reais para a inserção, verifique se o operador Clustered Index Insert possui a propriedade DMLRequestSort definida como true. A reutilização do plano em cache também pode ser um fator aqui, que uma OPTION (RECOMPILE)dica pode ajudar a evitar.

    Tenha também em mente que a primeira página de dados escritos usando FastLoadContexté sempre totalmente registrada. Mais detalhes em meus artigos vinculados acima.


    Também é possível ver diferentes comportamentos de bloqueio ao carregar um heap em massa, mas isso depende da versão do SQL Server que você está usando. Consulte a seção intitulada "Carregamento em massa, consultas NOLOCK e isolamento de instantâneo confirmado de leitura" no Guia de desempenho de carregamento de dados (alguns detalhes não se aplicam às versões atuais).

    • 3
  2. David Browne - Microsoft
    2023-11-25T07:50:00+08:002023-11-25T07:50:00+08:00

    Existem dois tipos de bloqueios de tabela. O bloqueio de tabela DML, que é um bloqueio X no objeto, como se você adicionasse uma dica de tabela TABLOCKX, e o bloqueio de esquema exclusivo SCH-M, obtido ao alterar o truncamento ou a troca de partição em uma tabela.

    READ UNCOMMITTED/NOLOCK lerá um TABLOCKX, mas não um bloqueio SCH-M.

    • 1

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

    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