Máy chủ SQL 2005
Tôi cần có thể liên tục xử lý khoảng 350 triệu bản ghi trong bảng bản ghi 900M. Truy vấn tôi đang sử dụng để chọn các bản ghi để xử lý trở nên bị phân mảnh nghiêm trọng khi tôi xử lý và tôi có nhu cầu dừng xử lý để xây dựng lại chỉ mục. Mô hình dữ liệu giả & truy vấn ...
/**************************************/
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;
/**************************************/
Nội dung dữ liệu ...
Trong khi cột [Kiểu dữ liệu ] được nhập dưới dạng CHAR (1), khoảng 35% của tất cả các bản ghi bằng 'X' với phần còn lại bằng 'A'.
Chỉ có các bản ghi trong đó [DataType] bằng 'X', khoảng 10% sẽ có giá trị KHÔNG NULL [DataStatus].
Các cột [ProcessDate] và [ProcessThreadId] sẽ được cập nhật cho mỗi bản ghi được xử lý.
Cột [DataType] được cập nhật ('X' được thay đổi thành 'A') khoảng 10% thời gian.
Cột [DataStatus] được cập nhật ít hơn 1% thời gian.
Bây giờ giải pháp của tôi là chọn khóa chính của tất cả các bản ghi để xử lý vào một bảng xử lý riêng. Tôi xóa các khóa khi tôi xử lý chúng để các phân đoạn chỉ mục tôi xử lý ít hồ sơ hơn.
Tuy nhiên, điều này không phù hợp với quy trình công việc tôi muốn có để các dữ liệu này được xử lý liên tục, không có sự can thiệp thủ công và thời gian chết đáng kể. Tôi dự đoán thời gian chết trên cơ sở hàng quý cho các công việc vệ sinh. Nhưng bây giờ, không có bảng xử lý riêng biệt, tôi không thể xử lý thậm chí một nửa bộ dữ liệu mà không có sự phân mảnh trở nên tồi tệ đến mức bắt buộc phải dừng và xây dựng lại chỉ mục.
Bất kỳ khuyến nghị để lập chỉ mục hoặc một mô hình dữ liệu khác nhau? Có một mô hình tôi cần nghiên cứu?
Tôi có toàn quyền kiểm soát mô hình dữ liệu và phần mềm xử lý để không có gì ngoài bàn.