Eu tenho uma tabela de heap que ocupa cerca de 104 GB de espaço em disco com quase 3 bilhões de linhas. Estou tentando criar um índice em cluster nesta tabela na WeekEndingDate
coluna [ ]. Eu tenho cerca de 200 GB grátis no arquivo de dados e cerca de 280 GB grátis no tempdb.
Eu tentei dois métodos diferentes. Primeiro foi criar o índice diretamente na tabela com o seguinte comando:
CREATE CLUSTERED INDEX CX_WT_FOLD_HISTORY
ON WT_FOLD_HISTORY (WeekEndingDate ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = ON,
IGNORE_DUP_KEY = OFF
, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
DATA_COMPRESSION = PAGE)
Eu tentei tanto com SORT_IN_TEMPDB = ON
e OFF
. Ao usá- ON
lo, preencheu o tempdb e, com OFF
ele, a unidade de dados.
Outro método era criar uma nova tabela em branco com o índice necessário e, em seguida, inserir os registros do heap na nova tabela. Isso também falhou após o preenchimento da unidade de dados.
Qualquer outra sugestão sobre o que fazer. A maioria das coisas que li afirmou que precisaria de 1,2 vezes o tamanho da tabela para ser usada como espaço de trabalho ao criar o índice. Eu tenho muito mais do que isso e ainda falha. Todas as sugestões serão apreciadas.
Aqui está minha estrutura de tabela de heap original:
CREATE TABLE [dbo].[WT_FOLD_HISTORY](
[WeekEndingDate] [varchar](50) NULL,
[Division] [varchar](50) NULL,
[Store] [varchar](50) NULL,
[SKUNumber] [varchar](50) NULL,
[UPC] [varchar](50) NULL,
[SalesUnits] [varchar](50) NULL,
[SalesCost] [varchar](50) NULL,
[SalesRetail] [varchar](50) NULL,
[InventoryUnits] [varchar](50) NULL,
[InventoryCost] [varchar](50) NULL,
[InventoryRetail] [varchar](50) NULL,
[OnOrderUnits] [varchar](50) NULL,
[OnOrderCost] [varchar](50) NULL,
[OnOrderRetail] [varchar](50) NULL,
[ReceiptUnits] [varchar](50) NULL,
[ReceiptCost] [varchar](50) NULL,
[ReceiptRetail] [varchar](50) NULL,
[PermanentMarkdowns] [varchar](50) NULL,
[ReturnsToVendor] [varchar](50) NULL,
[POSMarkdowns] [varchar](50) NULL,
[TimeFK] [smallint] NULL,
[LocationFK] [int] NULL,
[ItemFK] [int] NULL
) ON [AcademySports_DataFG1]
fonte
DATA_COMPRESSION=NONE
? Se isso funcionar, você poderá comprimir depois.Respostas:
Se você tiver uma necessidade a curto prazo de espaço em disco, uma opção seria:
NOTA: como outros sugeriram, eu só faria isso depois de remover temporariamente índices não agrupados da tabela em questão. Isso, em particular, permitirá que a adição do índice clusterizado seja mais rápida, pois todos os índices não clusterizados teriam que ser reconstruídos de qualquer maneira (com um índice clusterizado no lugar, a chave de índice é usada para localizar as linhas na própria tabela) .
Esse é realmente outro ponto - qual a largura da chave no índice clusterizado? Se você tiver índices não agrupados em cluster e a chave no índice clusterizado for significativamente maior que o ponteiro para o heap, os índices não agrupados consumirão mais espaço após a criação do índice clusterizado.
Se a chave do cluster consistir em várias colunas, ou mesmo uma coluna grande (por exemplo, uma
varchar
coluna com comprimento médio de 25 ou mais), convém considerar uma chave substituta (geralmente um valor crescente monotonicamente, para obter o melhorINSERT
desempenho).fonte
O que está preenchendo seu espaço é a sua mega-classificação (você tenta classificar todos os seus 104 GB em um todo), então eu acho que pode ser resolvido classificando em porções menores. Sugiro que você crie a nova tabela em cluster e insira os dados em pequenos pedaços como este:
Dessa forma, você classifica apenas 5000 linhas por vez e o único problema são as divisões de páginas que não podem ser evitadas, pois você não faz a inserção classificada. Portanto, quando terminar, a tabela new_clustered_ será fragmentada, mas você poderá reconstruí-la depois.
fonte
Apenas uma dica rápida - considere descartar todos os índices não agrupados em cluster (se houver) nesta pilha antes de tentar criar o Índice em Cluster. É possível criar um script para aqueles que não são de IC, juntamente com os detalhes das colunas de inclusão e criá-los mais tarde com essas definições depois que o Índice de Cluster é criado com êxito.
fonte