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 / 205089
Accepted
Coding Gorilla
Coding Gorilla
Asked: 2018-04-27 11:18:45 +0800 CST2018-04-27 11:18:45 +0800 CST 2018-04-27 11:18:45 +0800 CST

A consulta de exclusão usa 100% da CPU no Banco de Dados SQL do Azure

  • 772

Eu tenho um banco de dados relativamente pequeno, talvez algumas centenas de milhares de linhas, e temos um procedimento armazenado que se destina a limpar um 'Dealer' (a raiz agregada do aplicativo) e todos os dados relacionados. O banco de dados reside em uma instância v12 do Azure SQL e, quando atinge uma tabela específica, consome 100% da DTU/CPU da instância e leva muito tempo para ser concluído.

Acredito que o problema é que a tabela tem uma tonelada de chaves estrangeiras, provavelmente cerca de 30. Observando o plano de execução, você pode ver que está fazendo uma tonelada Nested Loopde varreduras de índice para encontrar linhas dependentes. Todas essas linhas já foram excluídas antes da tentativa de excluir as linhas dessa tabela específica, portanto, esses loops são realmente inúteis.

Minha pergunta é, seria mais eficiente desabilitar as restrições de chave estrangeira nessas tabelas dependentes, fazer a exclusão e reativar as restrições? Haveria algum efeito negativo em fazer isso, além do fato de ser tecnicamente possível que alguns dados ruins sejam inseridos enquanto as restrições estão desabilitadas. Ou existe uma maneira ainda melhor de realizar o que eu quero realizar?

ATUALIZAÇÕES Este é um banco de dados SQL do Azure v12, não é o SQL Server 2012 completo em uma VM. Não estou agrupando nenhuma exclusão e a instrução incorreta faz parte de um SPROC maior. Identifiquei essa exclusão de tabela em particular separando o sproc e executando pedaços dele separadamente. Quando chegou a esta mesa, levou literalmente 15 minutos para ser concluído. Isso afetará a ordem de centenas de linhas, variando dependendo do estado do 'Dealer' específico que estamos limpando.

Não podemos fazer exclusões temporárias neste caso porque geralmente estamos limpando esse revendedor para que ele possa ser substituído (exclusões temporárias causariam duplicação e exigiriam muito código para contornar). Eu investiguei outros tipos de bloqueio e estados de espera e não encontrei mais nada que parecesse estar afetando negativamente isso. Como mencionei, esse banco de dados é relativamente pequeno e é usado principalmente para operações CRUD muito simples.

Aqui está o plano de execução, é enorme. EXCLUIR DO plano de Execução Química

A versão XML do plano de execução pode ser encontrada aqui: https://gist.github.com/CodingGorilla/6cf7a87df9257d5f93e0d545af9839c2

azure-sql-database azure
  • 2 2 respostas
  • 2857 Views

2 respostas

  • Voted
  1. Best Answer
    David Spillett
    2018-04-28T01:38:59+08:002018-04-28T01:38:59+08:00

    Como você observa, o plano mostra muitas varreduras de índice[1], alguns dos índices várias vezes, como Facilities.IX_CustomerID. É por isso que ele está girando o recurso da CPU: esses índices estarão no pool de buffers, portanto, pouca E/S é necessária e as CPUs estão sendo feitas para mastigá-los, provavelmente em sua totalidade, repetidamente.

    Se isso for de uma instrução simples DELETEe todas as outras atividades forem o mecanismo que impõe restrições de chave estrangeira, eu verificaria as chaves estrangeiras sem oferecer suporte a índices. Por exemplo, uma das varreduras de [Facilities]" Index="[IX_CustomerID]tem o predicado de pesquisa [DataMateWeb].[dbo].[Facilities].[SurfaceCleanerID]=[DataMateWeb].[dbo].[Chemical].[ChemicalID], o que sugere que uma cobertura de índice [Facilities].[SurfaceCleanerID]não está presente ou, por algum motivo, não pode ser usada. Quando você define uma chave estrangeira, um índice não é criado automaticamente para acompanhá-lo, o que pode surpreender as pessoas e isso explicaria uma varredura da tabela/cluster em vez de várias buscas em um índice. Em todos os casos em que esses índices são os índices de suporte para as chaves estrangeiras, certifique-se de que eles estejam definidos corretamente e não tenham estatísticas desatualizadas.

    Se a operação de exclusão não for tão simples, certifique-se de que quaisquer junções e subconsultas usadas para decidir quais linhas serão excluídas sejam suportadas por índices apropriados e que os predicados de junção e filtragem sejam organizados de forma que possam ser sargáveis ​​sempre que possível.

    Falhando o acima (ou seja, todos os FKs e qualquer outra atividade de filtragem e junção parecem bem em relação a ter índices que eles poderiam buscar), o próximo canudo que eu escolheria é: se você estiver excluindo muitas linhas de uma só vez ( DELETE WHERE IN (<a result that could be a long list>)) então eu vi que fazer o SQL Server escanear o índice em vez de usar várias buscas. Isso parece um pouco desagradável[2], mas: verifique isso tentando confirmar o comportamento com apenas uma linha e, se isso alterar pelo menos algumas das verificações para buscas (e melhorar o desempenho como resultado), considere percorrer as linhas que precisam ser removidos e fazendo-os um de cada vez.

    [1] Como são varreduras de índice clusterizado , são efetivamente varreduras de tabela, o que para tabelas grandes significa que muitos dados estão sendo tocados.
    [2] Porque é desagradável. Mas se é desagradável e funciona, ainda funciona!

    • 2
  2. paparazzo
    2018-04-28T05:30:49+08:002018-04-28T05:30:49+08:00

    Se você não tiver a opção de desabilitar o FK ou colocar o banco de dados offline, poderá excluir em lotes com uma espera (suspensão) e manter a CPU inativa. Vai demorar mais, mas isso pode não ser um problema.

    • 1

relate perguntas

  • seleção única vs seleções múltiplas usando limite e deslocamento

  • Não há problema em criar centenas de bancos de dados no SQL Azure em vez de um grande e correr o risco de travar

  • Implementando uma tabela criptografada no SQL Azure

  • Servidor vinculado ao SQL Azure muito lento

  • Como posso alterar uma chave primária existente no SQL Azure?

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