SQL Server 2005
Muszę być w stanie nieprzerwanie przetwarzać około 350 milionów rekordów w tabeli rekordów 900 milionów. Kwerenda, której używam do wybrania rekordów do przetworzenia, ulega znacznej fragmentacji podczas przetwarzania i muszę przerwać przetwarzanie w celu odbudowania indeksu. Pseudo model danych i zapytanie ...
/**************************************/
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;
/**************************************/
Treść danych ...
Podczas gdy kolumna [DataType] jest wpisana jako CHAR (1), około 35% wszystkich rekordów jest równych „X”, a reszta równa się „A”.
Tylko z rekordów, w których [DataType] równa się „X”, około 10% będzie miało wartość NOT NULL [DataStatus].
Kolumny [ProcessDate] i [ProcessThreadId] będą aktualizowane dla każdego przetwarzanego rekordu.
Kolumna [DataType] jest aktualizowana („X” zmienia się na „A”) przez około 10% czasu.
Kolumna [DataStatus] jest aktualizowana mniej niż 1% czasu.
Na razie moim rozwiązaniem jest wybranie klucza podstawowego wszystkich rekordów do przetworzenia na osobną tabelę przetwarzania. Usuwam klucze podczas ich przetwarzania, tak że jako fragmenty indeksu mam do czynienia z mniejszą liczbą rekordów.
Jednak to nie pasuje do przepływu pracy, który chcę mieć, aby te dane były przetwarzane w sposób ciągły, bez ręcznej interwencji i znacznego przestoju. Przewiduję przestoje co kwartał w przypadku prac domowych. Ale teraz, bez osobnej tabeli przetwarzania, nie mogę przejść nawet przez przetwarzanie nawet połowy zbioru danych, ponieważ fragmentacja nie jest tak poważna, że konieczne jest zatrzymanie i przebudowanie indeksu.
Wszelkie zalecenia dotyczące indeksowania lub innego modelu danych? Czy jest jakiś wzór, który muszę zbadać?
Mam pełną kontrolę nad modelem danych i oprogramowaniem procesowym, więc nic nie stoi na przeszkodzie.