Eu tenho uma tabela muito grande (88 milhões de linhas, quase 300 GB de tamanho) que possui um índice clusterizado mal planejado. Eu quero adicionar um BIGINT
campo de identidade e torná-lo o novo índice clusterizado (tendo os atributos desejáveis de unique, narrow, static e sempre crescente ).
O problema é que também quero que esse novo campo de identidade seja ordenado de uma certa maneira nos registros atuais (com base em um campo de data existente que não seja o cluster atual). Assim, quando limparmos os registros mais antigos, todos eles ficarão contíguos no disco. (O campo de data não é exclusivo, portanto, não é um bom candidato para o cluster por si só.)
Como posso obter os valores desse novo campo de identidade ordenados da maneira que desejo?
A primeira ideia que tive foi fazer uma nova tabela com o campo de identificação, e apenas INSERT INTO
as linhas da tabela atual ORDER BY
o campo de data? Isso funcionaria?
Se eu não tiver espaço em disco suficiente para fazer isso, existe alguma maneira de fazer isso "no local"? Talvez alterando o índice clusterizado para o campo de data (aguarde muito tempo) e adicione a identidade (e aguarde muito tempo novamente)? Os valores da identidade são garantidos para serem ordenados pelo cluster atual?
Acabei de realizar o seguinte experimento em uma caixa do SQL Server 2012:
Resultado:
Próximo:
Resultados:
E mais um teste:
Resultados:
Suponho que isso não seja uma garantia de que o índice clusterizado dite a ordem em que uma nova coluna IDENTITY é preenchida - mas eu diria que indica fortemente que é muito provável.