SQL Server 2005
900M kayıt tablosunda yaklaşık 350M kayıtları sürekli olarak işleyebilmem gerekiyor. Ben işlem yapmak için kayıtları seçmek için kullandığım sorgu işlem olarak kötü parçalanmış olur ve ben dizin yeniden oluşturmak için işleme durdurmak gerekir. Sözde veri modeli ve sorgu ...
/**************************************/
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;
/**************************************/
Veri içeriği ...
[DataType] sütunu bir CHAR (1) olarak yazılırken, tüm kayıtların yaklaşık% 35'i 'X'e eşittir, geri kalanı' A'ya eşittir.
Yalnızca [DataType] 'X' değerine eşit olan kayıtlardan yaklaşık% 10'unun NOT NULL [DataStatus] değeri olacaktır.
[ProcessDate] ve [ProcessThreadId] sütunları işlenen her kayıt için güncellenecektir.
[DataType] sütunu yaklaşık% 10 oranında güncellenir ('X', 'A' olarak değiştirilir).
[DataStatus] sütunu zamanın% 1'inden daha az güncellenir.
Şimdilik benim çözümüm tüm kayıtların birincil anahtarını ayrı bir işlem tablosunda işlemek. Anahtarları, dizin parçaları olarak daha az kayıtla uğraştığım şekilde işlerken silerim.
Ancak bu, olmasını istediğim iş akışına uymuyor, böylece bu veriler manuel müdahale ve önemli kesinti süresi olmadan sürekli işleniyor. Temizlik işleri için üç ayda bir kesinti bekliyorum. Ama şimdi, ayrı bir işlem tablosu olmadan, veri kümesinin yarısını bile, parçalanma indeksi durdurmayı ve yeniden oluşturmayı gerektirecek kadar kötü hale getirmeden işleyemiyorum.
İndeksleme veya farklı bir veri modeli için herhangi bir öneriniz var mı? Araştırmam gereken bir model var mı?
Veri modeli ve süreç yazılımı üzerinde tam bir kontrole sahibim, böylece hiçbir şey masadan çıkmıyor.