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 / 240472
Accepted
carlo.borreo
carlo.borreo
Asked: 2019-06-14 02:16:06 +0800 CST2019-06-14 02:16:06 +0800 CST 2019-06-14 02:16:06 +0800 CST

Otimizando DELETEs de linha única de uma tabela com muitas referências FOREIGN KEY

  • 772

Em um banco de dados em que estou trabalhando, há uma tabela chamada personscom cerca de um milhão de linhas e 60 restrições FK (FK) de outras tabelas (algumas com muitos milhões de linhas) apontando para ela.

Se eu deletar uma linha de persons, demora muitos minutos, o que não seria um problema, mas também mantém a tabela bloqueada, bloqueando assim o banco de dados para todos os processos. No passado, isso fazia com que os usuários relatassem que o sistema estava inativo.

É claro que a situação melhoraria muito se eu adicionasse índices de suporte para todos os FKs (atualmente, apenas 20 das 60 tabelas o possuem). Mas muitos desses FKs são para colunas como modified_by, então todos os índices não teriam outra finalidade, e degradariam o desempenho do sistema nas operações diárias, apenas para ganhar uma melhora em um caso excepcional.

Antes de executar o DELETE, já me certifico de que todas as linhas de referência foram excluídas ou atualizadas. Faço isso manualmente, pois sou fortemente contra o uso do CASCADE.

Não estou considerando a exclusão reversível porque, caso contrário, teria que alterar todo o software que lê a personstabela para pular as linhas excluídas.

Pergunta

Existe uma maneira de (possivelmente temporariamente) alterar o mecanismo de bloqueio da personstabela, para que, mesmo que o DELETE demore uma hora, ele não afete os processos simultâneos?

Aqui está o plano de execução anônimo .

Considerações

  • Desabilitar FKs pode ser uma possibilidade. O risco é que outra pessoa crie inconsistência enquanto eu excluo a linha, então não consigo reativar os FKs.

  • Linhas a serem excluídas: normalmente uma de cada vez. Ou operação manual ou programada.

  • Ponto interessante: não verifiquei o plano de execução imediatamente, mas aparentemente, quase todas as operações custam 0%, exceto 7 casos de "Clustered index Scan (Clustered)" no PK das tabelas de referência; um deles custa 57%, o outro de 1% a 16%. Ainda não entendo por que ele deve verificar um índice clusterizado.

sql-server sql-server-2016
  • 1 1 respostas
  • 837 Views

1 respostas

  • Voted
  1. Best Answer
    Phill W.
    2019-06-14T03:03:11+08:002019-06-14T03:03:11+08:00

    a situação melhoraria muito se eu adicionasse índices de suporte para todos os FK (atualmente, apenas 20 das 60 tabelas o possuem)

    Você deve sempre indexar os campos usados ​​como chaves, estrangeiras ou não. Isso dá ao banco de dados muito mais opções ao analisar como executar a consulta e adicioná-las pode realmente aumentar o desempenho geral do seu aplicativo.

    muitos desses FK são para colunas como "modificado por", então todos os índices não teriam outro propósito

    Assim como [praticamente] tudo no Planet Database, é um compromisso.
    Aqui, você está equilibrando a integridade dos dados - sabendo com certeza quem mudou alguma coisa - contra a velocidade - não tendo esses índices extras que retardam as inserções. Realmente importa se você não conhece (com certeza) o usuário que alterou esses registros? Se não, você está bem como está. Se isso importa - e em muitos casos, realmente importa - então você está preso à sobrecarga dos índices.

    Antes de executar o DELETE, já me certifico de que todos os registros de referência foram excluídos...

    Com os FKs no lugar, você não poderá excluí-los de qualquer maneira, portanto, os valores dessa atividade são duvidosos.

    A pergunta realmente deveria ser: por que a exclusão está demorando uma hora?
    Se você estiver excluindo apenas um registro de uma tabela de um milhão de linhas e não houver linhas nas tabelas com FKs de volta a esta tabela, o que está demorando? Deve ser praticamente instantâneo.

    Consultas lentas, até mesmo exclusões, geralmente são causadas por índices ausentes - você está executando a exclusão com base no campo Chave Primária do registro? Ou alguma outra combinação de campos [não indexados]?

    • 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

    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