SQL Server 2005
Eu preciso ser capaz de processar continuamente cerca de 350 milhões de registros em uma tabela de 900 milhões. A consulta que estou usando para selecionar os registros a serem processados se torna muito fragmentada à medida que eu processo e preciso interromper o processamento para reconstruir o índice. Modelo e consulta de pseudo dados ...
/**************************************/
CREATE TABLE [Table]
(
[PrimaryKeyId] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
[ForeignKeyId] [INT] NOT NULL,
/* more columns ... */
[DataType] [CHAR](1) NOT NULL,
[DataStatus] [DATETIME] NULL,
[ProcessDate] [DATETIME] NOT NULL,
[ProcessThreadId] VARCHAR (100) NULL
);
CREATE NONCLUSTERED INDEX [Idx] ON [Table]
(
[DataType],
[DataStatus],
[ProcessDate],
[ProcessThreadId]
);
/**************************************/
/**************************************/
WITH cte AS (
SELECT TOP (@BatchSize) [PrimaryKeyId], [ProcessThreadId]
FROM [Table] WITH ( ROWLOCK, UPDLOCK, READPAST )
WHERE [DataType] = 'X'
AND [DataStatus] IS NULL
AND [ProcessDate] < DATEADD(m, -2, GETDATE()) -- older than 2 months
AND [ProcessThreadId] IS NULL
)
UPDATE cte
SET [ProcessThreadId] = @ProcessThreadId;
SELECT * FROM [Table] WITH ( NOLOCK )
WHERE [ProcessThreadId] = @ProcessThreadId;
/**************************************/
Conteúdo dos dados ...
Enquanto a coluna [DataType] é digitada como CHAR (1), cerca de 35% de todos os registros são iguais a 'X' e o restante é igual a 'A'.
Apenas dos registros em que [DataType] é igual a 'X', cerca de 10% terão um valor NOT NULL [DataStatus].
As colunas [ProcessDate] e [ProcessThreadId] serão atualizadas para cada registro processado.
A coluna [DataType] é atualizada ('X' é alterado para 'A') cerca de 10% do tempo.
A coluna [DataStatus] é atualizada menos de 1% do tempo.
Por enquanto, minha solução é selecionar a chave primária de todos os registros para processar em uma tabela de processamento separada. Excluo as chaves ao processá-las para que, como fragmentos do índice, eu esteja lidando com menos registros.
No entanto, isso não se encaixa no fluxo de trabalho que desejo ter, para que esses dados sejam processados continuamente, sem intervenção manual e tempo de inatividade significativo. Antecipo o tempo de inatividade trimestralmente para as tarefas domésticas. Mas agora, sem a tabela de processamento separada, não consigo processar nem metade do conjunto de dados sem que a fragmentação se torne tão ruim que exija a interrupção e a reconstrução do índice.
Alguma recomendação para indexação ou um modelo de dados diferente? Existe um padrão que eu preciso pesquisar?
Eu tenho controle total do modelo de dados e do software de processo, para que nada saia da mesa.