Tamanho da tabela = 44 GB (sem índice clusterizado)
Contagem de linhas = 122016576
Espaço em disco alocado para tempdb = 200 MB
Eu queria criar um índice clusterizado para a tabela devido aos tempos de consulta lentos, então executei a seguinte consulta:
USE [myDatabase]
GO
CREATE CLUSTERED INDEX [IX_Name] ON [dbo].[myTable]
(
[myColumn] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
Após 50 minutos de execução, os arquivos tempdb do meu servidor (4 no total) ficaram sem espaço e o banco de dados foi enviado para o status "Em recuperação" por cerca de 10 minutos. Está funcionando agora, mas estou confuso sobre por que o tempdb foi tão utilizado quando eu disse especificamente SORT_IN_TEMPDB = OFF.
Alguém sabe por que essa operação utilizou tanto espaço do tempdb?
Embora você tivesse
SORT_IN_TEMPDB = OFF
, essa não é a única coisa que usa tempdb. Você também definiuONLINE = ON
.Como o trabalho foi executado 50 minutos antes de você ter problemas, pode ser que você tenha atividade suficiente nessa única transação para preencher
tempdb
com dados de controle de versão de linha. Isso é descrito aqui:http://technet.microsoft.com/en-us/library/ms179542.aspx
Em parte, ele diz: "As operações de índice online usam controle de versão de linha para isolar a operação de índice dos efeitos das modificações feitas por outras transações. ... As operações simultâneas de atualização e exclusão do usuário durante as operações de índice online requerem espaço para registros de versão em
tempdb
."EDIT: Na verdade, 200 MB
tempdb
parece muito pequeno para um banco de dados com uma tabela de 44 GB.Ele precisa classificar os dados para o índice clusterizado em algum lugar e, em seguida, reescrever suas linhas nessa ordem.
Não se esqueça que o SQL Server adicionará um inteiro extra, o "uniquifier", para que possa eliminar a ambiguidade entre os valores não exclusivos de "myColumn". Isso fará com que todo o seu índice não clusterizado inclua "myColumn" + "uniquifier" (4 bytes).