Maneira indolor de criar um índice agrupado em uma tabela enorme?

22

Portanto, temos um site de clientes que reclama de um desempenho bastante lento. Dei uma olhada e é óbvio que o problema é que alguém mais (grrrr) projetou uma tabela com mais de 20 milhões de registros sem um índice em cluster.

Agora, quero criar um índice em cluster nessa tabela - mas no meu ambiente de teste, meu create indexcomando está em execução há uma hora e ainda não foi concluído. O site do cliente é um chão de fábrica que funciona 24 horas por dia, 7 dias por semana e não pode permitir uma hora de inatividade enquanto eu crio um índice.

Existe algum método com menos força bruta de criar o índice que finalize o trabalho rapidamente ou de alguma forma inteligente que não prejudique totalmente o desempenho do servidor enquanto estiver ocupado?

Estamos usando o SQL Server Enterprise Edition.

Shaul diz que eu apoio Monica
fonte

Respostas:

26
  • Se o seu servidor sql for Enterprise + edition e a tabela não tiver nenhum campo BLOB - CREATE CLUSTERED INDEX ... WITH(ONLINE=ON)

  • Caso contrário - não há outra maneira, exceto criar a tabela com o mesmo esquema ao lado e sabiamente transferir dados para ela, incluindo todas as operações INSERT / UPDATE / DELETE (usando acionador, por exemplo), e solte com precisão a tabela antiga e renomeie novos com o mesmo nome que os antigos - os contras são: lento, adiciona carga extra ao servidor e armazenamento

Oleg Dok
fonte
12

Não tenho certeza de qual versão do SQL Server seu cliente está usando. Na empresa, você pode criar o índice com (ONLINE = ON), para que a tabela esteja disponível até que o índice seja criado.


fonte
8
  • Crie uma nova tabela idêntica à original (obviamente precisará de um nome diferente)
  • Criar índice clusterizado na nova tabela
  • Carregar dados na nova tabela
  • Soltar tabela original
  • Renomeie a nova tabela usando o nome original

Certifique-se de aplicar as permissões necessárias no original.

Bryan
fonte