SQL Server 2005
Мені потрібно мати можливість постійно обробляти близько 350 млн записів в таблиці 900M записів. Запит, який я використовую для вибору записів для обробки, стає сильно фрагментованим, коли я обробляю, і мені потрібно зупинити обробку, щоб відновити індекс. Модель даних псевдо даних та запит ...
/**************************************/
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% часу.
Наразі моє рішення - вибрати первинний ключ усіх записів для обробки в окрему таблицю обробки. Я видаляю ключі, обробляючи їх, так що як фрагменти індексу я маю справу з меншою кількістю записів.
Однак це не відповідає робочому процесу, який я хочу мати, щоб ці дані оброблялися постійно, без ручного втручання та значного простою. Я щокварталу передбачу простої для проведення домашніх справ. Але тепер, не маючи окремої таблиці обробки, я не можу отримати обробку навіть половини набору даних без фрагментації, що стане настільки поганою, що вимагає зупинки та відновлення індексу.
Якісь рекомендації щодо індексації чи інша модель даних? Чи потрібна схема, яку мені потрібно дослідити?
Я повністю контролюю модель даних та програмне забезпечення процесів, тому нічого не стоїть поза столом.