SQL Server 2005
J'ai besoin de pouvoir traiter en continu environ 350 millions d'enregistrements dans une table d'enregistrement de 900 millions. La requête que j'utilise pour sélectionner les enregistrements à traiter devient très fragmentée au fur et à mesure que je traite et j'ai besoin d'arrêter le traitement pour reconstruire l'index. Pseudo modèle de données et requête ...
/**************************************/
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;
/**************************************/
Contenu des données ...
Alors que la colonne [DataType] est tapée en tant que CHAR (1), environ 35% de tous les enregistrements sont égaux à «X», le reste égal à «A».
Seuls les enregistrements où [DataType] est égal à «X», environ 10% auront une valeur NOT NULL [DataStatus].
Les colonnes [ProcessDate] et [ProcessThreadId] seront mises à jour pour chaque enregistrement traité.
La colonne [DataType] est mise à jour («X» est remplacé par «A») environ 10% du temps.
La colonne [DataStatus] est mise à jour moins de 1% du temps.
Pour l'instant, ma solution consiste à sélectionner la clé primaire de tous les enregistrements à traiter dans une table de traitement distincte. Je supprime les clés au fur et à mesure que je les traite afin qu'en tant que fragments d'index, je traite moins d'enregistrements.
Cependant, cela ne correspond pas au flux de travail que je souhaite avoir afin que ces données soient traitées en continu, sans intervention manuelle et temps d'arrêt important. Je prévois des temps d'arrêt tous les trimestres pour les tâches ménagères. Mais maintenant, sans la table de traitement séparée, je ne peux pas passer à travers le traitement de la moitié de l'ensemble de données sans que la fragmentation ne devienne si mauvaise qu'elle nécessite l'arrêt et la reconstruction de l'index.
Des recommandations pour l'indexation ou un modèle de données différent? Existe-t-il un modèle que je dois rechercher?
J'ai un contrôle total sur le modèle de données et le logiciel de processus, donc rien n'est hors de table.