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 / 241805
Accepted
Triynko
Triynko
Asked: 2019-07-02 08:54:12 +0800 CST2019-07-02 08:54:12 +0800 CST 2019-07-02 08:54:12 +0800 CST

Melhor maneira de configurar e manter uma tabela com muitas inserções e exclusões em média?

  • 772

Existe uma tabela de "consulta em lote" que possui duas colunas (BatchID, RecordID) que são ambas do tipo TSQL 'uniqueidentifier'. A chave de cluster exclusiva está ativada (BatchID, RecordID) e não há índices secundários.

Usamos SqlBulkCopy para inserir rapidamente milhares ou milhões de IDs na tabela em um único ID de lote, para que várias consultas possam se unir a ele para realizar a filtragem usando esse conjunto de IDs de registro associados a esse lote. Essa abordagem é muito mais rápida do que tentar várias consultas que enviam listas de IDs na string de consulta. Assim que as consultas forem concluídas, o lote de IDs de registro será excluído. A tabela fica vazia em média quando nenhuma consulta está em execução, mas pode ter centenas de lotes ativos, pois processamos milhares de solicitações de API por segundo que podem usar a tabela.

Minha pergunta é, que tipo de etapas de manutenção, se houver, são exigidas de um DBA para manter essas tabelas. Por exemplo, ele se beneficiaria da reconstrução periódica do índice ou o SQL Server lidaria com a limpeza das linhas excluídas (liberando blocos de página etc.) sozinho. Além disso, existe alguma configuração especial da tabela ou índice clusterizado que ajudaria, especialmente considerando que os identificadores são Guids aleatórios (identificadores exclusivos).

Geralmente usamos a versão mais recente do SQL Server, Enterprise Edition. Alguns servidores estão no Azure, alguns na AWS.

Também estou interessado em ouvir alternativas. Por exemplo, suponho que essa abordagem seja melhor com uma tabela permanente, mas também posso criar uma tabela temporária local de sessão como parte de uma transação que é excluída quando concluída, em vez de inserir e excluir linhas de uma tabela permanente. Só não sei como isso funcionaria em comparação.

sql-server performance
  • 2 2 respostas
  • 135 Views

2 respostas

  • Voted
  1. Best Answer
    Scott Hoffman
    2019-07-04T03:53:24+08:002019-07-04T03:53:24+08:00

    Em minha experiência com o SQL Server 2016 Enterprise Edition em um processo semelhante em que uma tabela permanente é usada como uma fila de mensagens - portanto, tem uma taxa muito alta de inserções e exclusões - descobrimos que a reconstrução de índices a cada 5 a 10 minutos é benéfica para forçar limpeza de registro deletado. Isso melhorou drasticamente o desempenho de leitura na mesa.

    Em nosso caso, o nível de isolamento do banco de dados é um instantâneo confirmado de leitura, e o processo de remoção da fila/exclusão estava excluindo registros mais rapidamente do que o processo de limpeza fantasma estava limpando-os. Com contagens altas de registros fantasmas, selecionar um registro às vezes levaria de 1 a 3 segundos, em vez de 5 a 10 ms, porque o SQL estava tendo que ler todos os registros fantasmas, indicados por uma contagem de varredura alta (com set statistics io on).

    Para verificar o número de registros fantasmas:

    SELECT version_ghost_record_count, * 
    FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('[transport].[BatchTable]'), NULL, NULL, 'SAMPLED')
    

    https://learn.microsoft.com/en-us/sql/relational-databases/ghost-record-cleanup-process-guide?view=sql-server-2017#ghost-record-cleanup-task

    O processo de limpeza fantasma é executado automaticamente em um intervalo (a cada 5 segundos para SQL Server 2012+, a cada 10 segundos para SQL Server 2008/2008R2) e verifica se alguma página foi marcada com registros fantasmas. Se encontrar algum, ele vai e exclui os registros que estão marcados para exclusão, ou fantasmas, tocando no máximo 10 páginas a cada execução.

    Em sistemas de alta carga com muitas exclusões, o processo de limpeza fantasma pode causar um problema de desempenho ao manter as páginas no pool de buffers e gerar E/S

    Acho que a parte "no máximo 10 páginas" foi nosso fator limitante, pois a alta taxa de exclusões excedia a quantidade de páginas que o processo de limpeza poderia tocar em cada execução.

    • 6
  2. user126897
    2019-07-03T22:32:28+08:002019-07-03T22:32:28+08:00

    Eu recomendaria usar tabelas com otimização de memória . Pelo que entendi, você não precisa preservar o conteúdo na reinicialização do servidor, portanto, use-o no modo não persistente. Eles geralmente podem ser 5 a 10 vezes mais rápidos do que tabelas temporárias ou variáveis ​​de tabela. - piotr

    • 1

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