SQL Server 2005
Мне нужно иметь возможность непрерывно обрабатывать около 350 миллионов записей в таблице записей 900 миллионов. Запрос, который я использую для выбора записей для обработки, становится сильно фрагментированным, когда я обрабатываю, и мне нужно остановить обработку, чтобы перестроить индекс. Псевдо модель данных и запрос ...
/**************************************/
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;
/**************************************/
Содержание данных ...
В то время как столбец [DataType] напечатан как CHAR (1), около 35% всех записей равны 'X', а остаток равен 'A'.
Только из записей, где [DataType] равен 'X', около 10% будут иметь значение NOT NULL [DataStatus].
Столбцы [ProcessDate] и [ProcessThreadId] будут обновляться для каждой обрабатываемой записи.
Столбец [DataType] обновляется («X» изменяется на «A») примерно в 10% случаев.
Столбец [DataStatus] обновляется менее 1% времени.
На данный момент мое решение состоит в том, чтобы выбрать первичный ключ всех записей для обработки в отдельной таблице обработки. Я удаляю ключи по мере их обработки, чтобы в качестве фрагментов индекса я имел дело с меньшим количеством записей.
Однако это не соответствует рабочему процессу, который я хочу иметь, так что эти данные обрабатываются непрерывно, без ручного вмешательства и значительных простоев. Я ожидаю простоя на ежеквартальной основе по дому. Но теперь, без отдельной таблицы обработки, я не могу обработать даже половину набора данных без фрагментации, становящейся настолько плохой, что требует остановки и перестройки индекса.
Любые рекомендации по индексации или другой модели данных? Есть шаблон, который мне нужно исследовать?
У меня есть полный контроль над моделью данных и программным обеспечением процесса, так что ничего не выходит за рамки.