SQL Server 2005
ฉันต้องสามารถประมวลผลระเบียน 350M อย่างต่อเนื่องในตารางบันทึก 900M แบบสอบถามที่ฉันใช้เพื่อเลือกระเบียนที่จะดำเนินการจะแยกส่วนอย่างไม่ดีตามที่ฉันดำเนินการและฉันจำเป็นต้องหยุดการประมวลผลเพื่อสร้างดัชนีใหม่ จำลองข้อมูล & คิวรีแบบหลอก ...
/**************************************/
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;
/**************************************/
เนื้อหาข้อมูล ...
ในขณะที่คอลัมน์ [ประเภทข้อมูล] ถูกพิมพ์เป็น CHAR (1) ประมาณ 35% ของระเบียนทั้งหมดเท่ากับ 'X' กับส่วนที่เหลือเท่ากับ 'A'
เฉพาะในเร็กคอร์ดที่ [DataType] เท่ากับ 'X' ประมาณ 10% จะมีค่า NOT NULL [DataStatus]
คอลัมน์ [ProcessDate] และ [ProcessThreadId] จะได้รับการอัปเดตสำหรับทุกระเบียนที่ประมวลผล
คอลัมน์ [ประเภทข้อมูล] ได้รับการอัปเดต ('X' เปลี่ยนเป็น 'A') ประมาณ 10% ของเวลา
คอลัมน์ [DataStatus] ได้รับการอัปเดตน้อยกว่า 1% ของเวลา
สำหรับตอนนี้โซลูชันของฉันคือการเลือกคีย์หลักของระเบียนทั้งหมดเพื่อประมวลผลลงในตารางการประมวลผลแยกต่างหาก ฉันลบปุ่มต่าง ๆ ในขณะที่ฉันประมวลผลเพื่อให้เป็นชิ้นส่วนดัชนีที่ฉันจัดการกับระเบียนน้อยลง
อย่างไรก็ตามนี่ไม่เหมาะกับเวิร์กโฟลว์ที่ฉันต้องการเพื่อให้ข้อมูลเหล่านี้ได้รับการประมวลผลอย่างต่อเนื่องโดยไม่มีการแทรกแซงด้วยตนเองและการหยุดทำงานที่สำคัญ ฉันคาดว่าจะหยุดทำงานเป็นประจำทุกไตรมาสสำหรับงานบ้านทำความสะอาด แต่ตอนนี้หากไม่มีตารางการประมวลผลแยกกันฉันไม่สามารถผ่านการประมวลผลได้แม้แต่ครึ่งหนึ่งของชุดข้อมูลโดยที่การแตกแฟรกเมนต์ไม่ดีเท่าที่จำเป็นในการหยุดและสร้างดัชนีใหม่
คำแนะนำสำหรับการจัดทำดัชนีหรือรูปแบบข้อมูลอื่น จำเป็นต้องมีรูปแบบการวิจัยหรือไม่?
ฉันมีการควบคุมเต็มรูปแบบของข้อมูลและซอฟต์แวร์กระบวนการดังนั้นจึงไม่มีอะไรอยู่นอกตาราง