Portanto, temos um site de cliente que está reclamando de um desempenho muito lento. Dei uma olhada e é óbvio que o problema é porque Somebody Else (grrrr) projetou uma tabela contendo mais de 20 milhões de registros sem um índice agrupado.
Agora quero criar um índice clusterizado nessa tabela - mas em meu ambiente de teste, meu create index
comando 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 perder uma hora de inatividade enquanto crio um índice.
Existe algum método com menos força bruta para criar o índice que terminará o trabalho rapidamente ou o fará de alguma maneira inteligente que não acabará totalmente com o desempenho do servidor enquanto estiver ocupado?
Estamos usando o SQL Server Enterprise Edition.
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 transferir dados com sabedoria para ela, incluindo todas as operações INSERT/UPDATE/DELETE (usando o gatilho, por exemplo) e, em seguida, descartar com precisão a tabela antiga e renomear novo com o mesmo nome do antigo - os contras são: lento, adiciona carga extra ao servidor e ao armazenamento
Não tenho certeza de qual versão do servidor SQL seu cliente está usando. Na empresa, você pode criar o índice com (ONLINE = ON), para que a tabela fique disponível até que o índice seja criado.
Certifique-se de aplicar todas as permissões exigidas no original.