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 / 216598
Accepted
JohnG
JohnG
Asked: 2018-09-04 09:50:36 +0800 CST2018-09-04 09:50:36 +0800 CST 2018-09-04 09:50:36 +0800 CST

Criar índice na tabela de 106 milhões de linhas

  • 772

Eu tenho um aplicativo instalado em todo o mundo que usa versões do SQL do SQL Server 2008 Express para o SQL Server 2017 Enterprise Edition.

Eu tentei várias maneiras de criar um índice (3 colunas com uma inclusão de 3 colunas) em uma grande tabela onde o banco de dados geralmente está em modelo de recuperação simples, mas pode ser como modelo de recuperação completa... Hardware pode variar drasticamente de um cliente para cima outro:

  1. Alterar tabela criar índice...
  2. Crie uma tabela tmp com o novo índice e copie os dados com um "inserir em" seguido de uma tabela de descarte da tabela original e uma renomeação da tabela tmp para substituir a original.
  3. Crie uma tabela tmp com o novo índice e use um script do PowerShell para copiar os dados seguido por uma tabela de descarte da tabela original e uma renomeação da tabela tmp para substituir a original.

A mais rápida das 3 foi a 1ª opção (a forma tradicional de criar um índice não clusterizado) que levou 1h15m para um pouco mais de 106 milhões de registros (a tabela tem 200 colunas... não é o ideal mas é com o que estou trabalhando ) as outras opções levaram o triplo do tempo e mais)

Infelizmente, não posso usar o recurso online, pois há uma variedade de versões do SQL Server e o online só é bom para a edição corporativa.

Uma hora e 15 minutos no meu laboratório é muito tempo e eu gostaria de tentar encontrar outra maneira de diminuir isso, especialmente que em uma de nossas próximas atualizações de aplicativos, precisaremos criar 23 índices ... e eu ainda não vi uma atualização que leva de 5 a 6 horas e os clientes não vão querer esperar de 5 a 6 horas por uma atualização de software.

Além disso, a atualização não exigirá nenhuma atividade no banco de dados durante a atualização.

Tudo o que estou procurando são ideias que eu possa tentar criar meus índices em um período de tempo razoável. Nenhum código! só precisa de ideias teóricas.

Qualquer ideia seria muito apreciada.

sql-server index
  • 1 1 respostas
  • 6621 Views

1 respostas

  • Voted
  1. Best Answer
    Erik Darling
    2018-09-04T11:03:08+08:002018-09-04T11:03:08+08:00

    Deixo isso como resposta, embora seja principalmente um Extended Comment®.

    Você não menciona as definições de índice ou os tipos de colunas que está tentando indexar. Você diz que a tabela tem 200 colunas, mas, a menos que esteja criando um índice clusterizado, isso não importa. A menos que você esteja tentando criar um índice não clusterizado em 200 colunas. Se sim, por favor, reconsidere.

    Dado que você está fazendo isso em muitas versões diferentes, é provável que elas também estejam em hardware diferente. No caso da criação de índices, o hardware e os índices existentes terão um impacto dramático no tempo de conclusão. Não é como se você pudesse ajustar a consulta por trás da criação do índice. Da mesma forma, a capacidade do Enterprise Edition de paralelizar a criação de índice pode ser um fator importante.

    Além do hardware, a simultaneidade do sistema também pode desempenhar um papel, seja por meio de bloqueio ou uso geral de recursos. Você não menciona se esses são problemas, então, novamente, é um ponto cego para quem tenta responder.

    Em versões mais recentes do SQL Server, você pode optar por classificar a criação de índice em tempdb . Isso pode ajudar, desde que tempdb não seja Full Metal Potato© em seus diferentes ambientes.

    Finalmente, você não menciona o modelo de recuperação de seus bancos de dados. Como CREATE INDEX pode ser minimamente registrado , pode valer a pena alternar para SIMPLEo BULK LOGGEDmodelo de recuperação, se possível. Isso dependerá de seus objetivos de RPO e RTO e se eles podem ser dispensados ​​para uma janela para criar os índices.

    Um comentário rápido sobre a etapa 2 que se relaciona um pouco com o comentário acima: Se você criar uma tabela sem índices, carregar seus dados e criar índices, provavelmente será mais rápido. Especialmente em SIMPLEou BULK LOGGED, você pode usar a TABLOCK dica para obter o log mínimo na inserção, bem como na criação do índice.

    Sua pergunta provavelmente será fechada como muito ampla, mas espero que você ache este Comentário Estendido® útil.

    • 7

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

  • Como determinar se um Índice é necessário ou necessário

  • 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