SQL Server 2005
Saya harus dapat terus memproses sekitar 350 juta catatan dalam tabel 900 juta catatan. Kueri yang saya gunakan untuk memilih catatan yang akan diproses menjadi sangat terfragmentasi saat saya memproses dan saya harus menghentikan pemrosesan untuk membangun kembali indeks. Model data semu & kueri ...
/**************************************/
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;
/**************************************/
Konten data ...
Sementara kolom [Tipe Data ] diketik sebagai CHAR (1), sekitar 35% dari semua catatan sama dengan 'X' dan sisanya sama dengan 'A'.
Dari hanya catatan di mana [Jenis Data] sama dengan 'X', sekitar 10% akan memiliki nilai NOT NULL [DataStatus].
Kolom [ProcessDate] dan [ProcessThreadId] akan diperbarui untuk setiap catatan yang diproses.
Kolom [DataType] diperbarui ('X' diubah menjadi 'A') sekitar 10% dari waktu.
Kolom [DataStatus] diperbarui kurang dari 1% dari waktu.
Untuk saat ini solusi saya adalah memilih kunci utama dari semua catatan untuk diproses menjadi tabel pemrosesan yang terpisah. Saya menghapus kunci saat saya memprosesnya sehingga sebagai fragmen indeks saya berurusan dengan lebih sedikit catatan.
Namun, ini tidak sesuai dengan alur kerja yang saya inginkan sehingga data ini diproses terus menerus, tanpa intervensi manual dan downtime yang signifikan. Saya mengantisipasi downtime setiap tiga bulan untuk pekerjaan rumah tangga. Tapi sekarang, tanpa tabel pemrosesan yang terpisah, saya tidak bisa melewati pemrosesan bahkan setengah dari set data tanpa fragmentasi menjadi begitu buruk sehingga mengharuskan berhenti dan membangun kembali indeks.
Adakah rekomendasi untuk pengindeksan atau model data yang berbeda? Apakah ada pola yang perlu saya teliti?
Saya memiliki kontrol penuh terhadap model data dan perangkat lunak proses sehingga tidak ada yang salah.