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 / 90208
Accepted
Andy
Andy
Asked: 2015-01-27 08:19:24 +0800 CST2015-01-27 08:19:24 +0800 CST 2015-01-27 08:19:24 +0800 CST

Atualizando tabelas grandes (~ 6,5 milhões de linhas) e índices

  • 772

Estou tentando atualizar uma tabela com cerca de 6,5 milhões de linhas em um tempo razoável, mas estou tendo alguns problemas. Estamos adicionando uma nova coluna a uma tabela existente e, em seguida, definindo um valor para todas as linhas com base nos dados de uma coluna em outra tabela.

UPDATE  TOP (20000) c
SET     c.NewColumn = ISNULL(p.Col1, p.Col2)
FROM    dbo.Child c
    INNER JOIN dbo.Parent p on c.FKId = p.Id
WHERE   c.NewColumn IS NULL

em um loop, como este artigo . A atualização ainda estava em execução após 2,5 horas. Eu estou querendo saber se desabilitar os índices dbo.Childcausaria um impacto. NewColumn não tem índices, nem terá, mas existem outros índices (cerca de 5) emdbo.Child

O SQL Server é inteligente o suficiente para ver que não precisa atualizar os outros índices (já que eles não fazem parte do UPDATE), ou nos beneficiaríamos desabilitando temporariamente os índices enquanto fazemos as instruções de atualização?

Este é o SQL Server 2012, mas o banco de dados em questão está no modo de compatibilidade de 2008.

index sql-server-2012
  • 2 2 respostas
  • 7746 Views

2 respostas

  • Voted
  1. Solomon Rutzky
    2015-01-27T21:58:38+08:002015-01-27T21:58:38+08:00

    Você diz que o UPDATE está rodando em loop e ainda estava rodando depois de 2,5 horas. Esse loop atualizou alguma linha? Era o próprio loop que estava demorando muito ou uma única instrução UPDATE? Essa é uma distinção um tanto importante e atualmente é ambígua nas informações fornecidas. No entanto, aqui estão algumas coisas a serem observadas com base nas coisas ditas na pergunta:

    • Não, o SQL Server não deve atualizar índices que não usam a nova coluna

    • Desativar índices não é simplesmente uma questão de desativá-los. Na verdade, ele descarta todas as páginas de índice e mantém apenas a estrutura para que você não precise executar a instrução CREATE completa novamente. Mas reabilitar um índice terá que reconstruí-lo.

    E aqui estão algumas coisas para procurar:

    • Há algum gatilho UPDATE na Childtabela?

    • Qual é a configuração de crescimento automático no log de transações? Se definido como um número muito baixo, pode ser que os UPDATEs sejam impedidos por um grande número de operações de crescimento automático.

    • Desses 5 índices na Childtabela, algum deles tem FKIdcomo coluna inicial?

    • Você já tentou tamanhos de lote menores ou apenas 20k? Já vi várias pessoas recomendarem aleatoriamente tamanhos de lote grandes (10k - 50k) para esses tipos de operações sem considerar que isso não apenas limita a operação a esse número, mas também sugere ao Otimizador de consultas que o número é possível de ser atingido em o primeiro lugar. Portanto, se houver apenas 5.000 linhas para localizar, ele poderá continuar examinando-as para ver se outras atendem aos c.NewColumn IS NULLcritérios. E considerando que o campo não está indexado, tudo o que o QO tem que continuar são as estatísticas geradas automaticamente que não informam onde encontrar o restanteNULLlinhas. Presumindo que as primeiras iterações do loop foram bem-sucedidas, o SQL Server ainda precisa localizar 20.000 linhas NULL, dos 6,5 milhões, verificando quantas forem necessárias, em nenhuma ordem específica, antes de localizá-las. Portanto, as primeiras iterações provavelmente ocorreram rapidamente, mas esse tipo de operação diminui rapidamente, pois cada passagem sucessiva precisa verificar mais e mais registros antes de encontrar os 20.000 que atendem aos IS NULLcritérios.

      Então, duas coisas a considerar:

      • Comece com um tamanho de lote pequeno, talvez 10 linhas, e execute essa instrução sozinha (ou seja, não no loop). Ele volta? Caso contrário, você precisa responder à pergunta de @Aaron sobre o que é WAIT_RESOURCE. Se ele voltar, aumente o tamanho do lote para 100, depois 500, 1.000, 2.000, 5.000 e 10.000. Serão necessários mais loops para concluir, mas será mais fácil encontrar o número necessário de registros para ATUALIZAR. Depois de encontrar um tamanho que pareça responsivo, você pode executar o loop novamente (acho que em algum lugar na faixa de 2.000 a 5.000 vai funcionar :)
      • Em vez de se livrar dos índices, você pode querer criar um índice, temporariamente, para dar suporte a essa operação UPDATE específica. Um índice filtrado (que foi introduzido no SQL Server 2008 para que o modo de compatibilidade não seja um problema) permitirá que você direcione as linhas restantes para atualização. Algo como:

        CREATE NONCLUSTERED INDEX [IX_Child_FKId_temp]
          ON dbo.Child ([FKId] ASC) -- you might need to include [NewColumn] ASC after [FKId]
          WHERE [NewColumn] IS NULL
          WITH ( FILLFACTOR = 100 );
        
    • 2
  2. Best Answer
    Andy
    2015-06-11T06:34:30+08:002015-06-11T06:34:30+08:00

    Tinha me esquecido dessa pergunta, desculpe. Mas resolvemos o problema. O uso de uma instrução MERGE reduziu o tempo de consulta para menos de uma hora. A desativação de índices não teve efeito.

    • 0

relate perguntas

  • Como criar várias entradas no índice com base nos campos de uma linha?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quanto "Padding" coloco em meus índices?

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

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