Eu tenho uma tabela de aproximadamente 1 bilhão de linhas. Eu então crio um índice da seguinte forma:
CREATE NONCLUSTERED INDEX [IX_Index1]
ON [dbo].[MyTable]( [CustomerID] ASC ) -- CustomerID is uniqueidentifier
WITH (DATA_COMPRESSION=PAGE);
Isso resulta em um índice de 9,15 GB (compactado), no entanto, o log de transações passou de vazio para 158 GB enquanto o índice estava sendo criado (nenhuma outra atividade de banco de dados). Por que a quantidade de espaço de log usada é muito maior do que o tamanho resultante do índice?
O banco de dados é o SQLServer 2014 Enterprise em modo de recuperação total em um grupo de disponibilidade.
Atualização
Larguei e recriei o índice com a opção SORT_IN_TEMPDB = ON
. As gravações de log de transações resultantes foram 10,4 GB para o tlog do banco de dados e 1,27 GB para o tempdb tlog.
Referindo-se à documentação do MS aqui . Também criando um índice de 60 GB no SQLFool.
O que eu acredito que está acontecendo é que quando o índice está sendo construído com
SORT_IN_TEMDB=OFF
, toda a construção do índice processada é registrada por meio do log de transações do banco de dados (o banco de dados está definido para recuperação total). (Além disso, espero que haja um grande número de divisões de página devido à natureza dispersa da coluna GUID que está sendo indexada)Quando o índice é criado usando
SORT_IN_TEMPDB=ON
, a maior parte da atividade do log de transações será contra otempdb
que está noSIMPLE
modo de recuperação.