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 / 270678
Accepted
yegnasew
yegnasew
Asked: 2020-07-10 05:36:58 +0800 CST2020-07-10 05:36:58 +0800 CST 2020-07-10 05:36:58 +0800 CST

Truncar uma tabela com 17 bilhões de linhas em um AG

  • 772

Preciso truncar uma tabela com 17 bilhões de linhas, a tabela está em um banco de dados que faz parte de um AG.

Qual será o efeito dessa operação na latência do AG e no tamanho dos backups de log?

Existe uma maneira recomendada de fazer isso?

sql-server availability-groups
  • 2 2 respostas
  • 3761 Views

2 respostas

  • Voted
  1. Josh Darnell
    2020-07-10T08:52:49+08:002020-07-10T08:52:49+08:00

    Extensões de registro

    A quantidade de dados de log gerados (e, portanto, enviados pela rede para seus outros nós AG) depende do tamanho das linhas em sua tabela de 17 bilhões de linhas. definitivamenteTRUNCATE será uma quantia pequena comparada a fazer um . Mas ainda pode ser significativo, dependendo de sua infraestrutura e expectativas.DELETE

    Considere a dbo.Votestabela no banco de dados de amostra do Stack Overflow:

    captura de tela do SSMS mostrando as colunas na tabela de votos e seus tipos de dados

    Cada linha tem 28 bytes. Uma página no SQL Server tem 8 KB (8.192 bytes), portanto você pode ajustar cerca de 292 linhas em uma página. Isso não é exatamente correto, pois há sobrecarga para páginas e linhas, mas é uma aproximação decente para este exemplo.

    Isso significa que são necessárias cerca de 58.219.178 páginas para conter todas as 17 bilhões de linhas. Ao fazer um DROPou TRUNCATE, uma tarefa em segundo plano desaloca extensões (grupos de 8 páginas). Cada uma dessas desalocações é registrada. Isso significa que cerca de 7.277.397 registros de log serão criados truncando esta tabela.

    Testedbo.Votes

    Eu tentei isso na minha cópia desse banco de dados de exemplo, depois de definir o modelo de recuperação como completo e fazer backups completos e de log para inicializar a cadeia de backup. A dbo.Votestabela tem 10.146.802 linhas. Com base em nossos cálculos anteriores, isso deve ser em torno de 34.749 páginas, ou 4.343 extensões.

    Na realidade, essa tabela usa 47.721 páginas alocadas a ela (por causa da sobrecarga mencionada anteriormente), o que equivale a 5.965.125 extensões.

    Agora vou TRUNCATEa mesa:

    TRUNCATE TABLE dbo.Votes;
    

    Isso é concluído instantaneamente, mas acabei com 17.605 registros de log. Parece que há realmente 3 registros de log por extensão (2 para atualizar as páginas IAM e GAM, um para atualizar a página PFS para desalocar a página de dados).

    Esses registros de log totalizaram apenas até ~1,28 MB de uso do arquivo de log. Mas sua tabela real tem 1.600 vezes mais linhas que essa, e os tamanhos das linhas podem ser maiores. Isso pode significar mais de 1 GB de dados de log gerados e enviados para cada réplica pela rede.

    A quantidade de dados aumenta ainda mais se você tiver índices não clusterizados nesta tabela, que são registrados da mesma maneira.

    O tamanho da linha faz uma grande diferença

    Outro estudo de caso poderia ser a dbo.Commentsmesa. Tem 3.907.472 linhas, mas cada linha tem 1.424 bytes (máximo - a Textcoluna é nvarchar(700)).

    Apesar de ter um número significativamente menor de linhas que dbo.Votes, essa tabela possui 176.722 páginas alocadas a ela. TRUNCATEing dbo.Commentsresulta em 63.792 registros de log e 4,86 ​​MB de dados de log.

    Se o tamanho real da sua linha for maior neste estádio, isso poderá ser superior a 7,5 GB de dados de log.

    O que fazer

    Talvez sua infraestrutura e arquivos de log possam lidar com vários GB de dados facilmente - se você tiver uma tabela de 17 linhas B, parece que eles deveriam! Mas achei que valeria a pena mencionar que a quantidade de tráfego não é necessariamente insignificante, pois as respostas existentes não trouxeram isso à tona.

    Teste em um ambiente sem produção, se puder. Meça o uso do arquivo de log antes e depois e certifique-se de que sua infraestrutura de produção esteja configurada para lidar com essa quantidade de dados. Certifique-se de que o arquivo de log foi pré-dimensionado para lidar com esse truncado - ter um crescimento automático no meio desta operação tornará as coisas muito lentas e causará bloqueio.

    Se você não puder testar, faça o possível para estimar qual será o impacto. Use uma consulta como esta para obter o número de páginas na tabela. Em seguida, divida isso por 8 (para obter o número de extensões) e multiplique por 3 para obter o número aproximado de registros de log.

    Meus testes tiveram tamanhos médios de registro de log de cerca de 70 bytes, mas não sei se isso é típico. Mas você pode tentar multiplicar os registros de log aproximados por 70 para obter o número de bytes de log em potencial produzidos pelo truncado.

    Com o AG na mistura, você também pode brincar com a compressão do fluxo de log . Eu não usei esses sinalizadores de rastreamento, então estou apenas mencionando que é outro botão que você pode ajustar.


    Se você achar que a TRUNCATEabordagem é muito imprevisível ou demais para seus sistemas, você sempre pode usar um normal DELETEem lotes. Isso usa mais log no total, mas você pode distribuí-lo por qualquer período de tempo que desejar. No entanto, certifique-se de tomar cuidado ao criar scripts em lotes se você seguir esse caminho.

    • 59
  2. Best Answer
    Aleksey Vitsko
    2020-07-10T06:08:02+08:002020-07-10T06:08:02+08:00

    Truncate tablecomando trunca linhas instantaneamente e não grava linhas excluídas no arquivo de log de transações

    Geralmente Truncate tableé executado instantaneamente e não há tráfego de rede perceptível entre as réplicas no AG, não haverá backups de log perceptíveis como consequência etc., em comparação com quando você faz Delete from. No entanto, pode haver tráfego perceptível e backup de log perceptível , porque 17 bilhões de linhas é muito .

    PS Considere fazer backup do banco de dados e salve o backup no arquivo antes de truncar, para que você possa restaurar a tabela de 17 bilhões mais tarde, se necessário

    • 19

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