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 / 5031
Accepted
garik
garik
Asked: 2011-08-26 06:23:19 +0800 CST2011-08-26 06:23:19 +0800 CST 2011-08-26 06:23:19 +0800 CST

Bloqueio, solução de bloqueio ao processar dados na mesma tabela

  • 772

Meu banco de dados tem uma tabela: tableX.

Task1 faz INSERTs intensivos (1000 registros por minuto) como registros para processar e muito raramente UPDATEs (1-2 registros por minuto) como registros para recalcular.

Ao mesmo tempo, outro Task2 SELECTs não processa registros (inserido por Task1) e, em seguida, insere novos registros (conforme processados) na mesma tabelaX em uma transação (é um cálculo muito longo, até 10 segundos).

Task3 recalcula registros ATUALIZADOS (por Task1): apenas ATUALIZA tableX.

Alguém poderia recomendar um design para evitar longos bloqueios e impasses para este cenário. É muito importante processar todos os registros INSERIDOS na ordem em que foram inseridos!

1) Devo separar (criar uma nova tabelaX2) registros processados ​​e não processados?

2) Devo separar a transação em Task1 e fazer SELECTs e INSERTs em duas transações separadas?

3) Devo usar rowlock, readpast...hints e onde (pode me ajudar)?

sql-server-2008 transaction
  • 1 1 respostas
  • 697 Views

1 respostas

  • Voted
  1. Best Answer
    Simon Hughes
    2011-08-26T14:04:25+08:002011-08-26T14:04:25+08:00

    Simples este.

    Task1 não deve inserir na tabela principal, mas em uma tabela de preparação, digamos tableXstaging. Essa tabela deve incluir uma coluna de identidade ou uma coluna row_processed (TINYINT ou BIT).

    Task1 continua inserindo o tempo todo em tableXstaging. Eu permitiria atualizações para atualizar a tabela principal diretamente, pois são raras.

    Outra tarefa que é executada uma vez a cada minuto: definirá MaxID = max(coluna de identidade) de tableXstaging ou, se você tiver usado row_processed, definirá row_processed = 1. Isso fornecerá o lote com o qual trabalhar. Esta tarefa irá inserir na tableX todos os registros onde identity<=MaxID, ou se você estiver usando row_processed, WHERE row_processed = 1. Uma única inserção em sua tableX primária é muito rápida. Em seguida, exclua de tableXstaging onde row_processed = 1 ou WHERE identity<=MaxID. Eu iria com identidade, pois você não precisa atualizar row_processed = 1 onde row_processed = 0 e, portanto, será mais rápido.

    tableX agora é inserido apenas uma vez por minuto.

    Na verdade, relendo sua pergunta, eu iria com row_processed, definir row_processed = 1 para seu primeiro lote.

    A Tarefa 2 funciona na tabela de preparação WHERE row_processed = 1. Em seguida, define row_processed = 2.

    A tarefa 3 funciona na tabela de preparação WHERE row_processed = 2. Em seguida, define row_processed = 3.

    Finalmente, SET XACT_ABORT ON; BEGIN TRAN, você insere os registros na tableX em um hit (row_processed=3). Isso é muito eficiente, pois a tabela de preparação é pequena e a tableX será muito grande e lenta (em termos relativos à tabela de preparação). Em seguida, exclua do estágio onde row_processed = 3. COMMIT;

    • 3

relate perguntas

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

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

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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