SQL सर्वर 2005
मुझे 900M रिकॉर्ड तालिका में 350M रिकॉर्ड के बारे में निरंतर प्रक्रिया करने में सक्षम होना चाहिए। मैं जिस प्रक्रिया को रिकॉर्ड करने के लिए चयन करने के लिए उपयोग कर रहा हूं वह क्वेरी मैं प्रक्रिया के रूप में बुरी तरह से खंडित हो जाती है और मुझे सूचकांक के पुनर्निर्माण के लिए प्रसंस्करण को रोकने की आवश्यकता है। छद्म डेटा मॉडल और क्वेरी ...
/**************************************/
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%।
केवल उन अभिलेखों में जहां [DataType] 'X' के बराबर होता है, लगभग 10% में NOT NULL [DataStatus] मान होगा।
[ProcessDate] और [ProcessThreadId] कॉलम को संसाधित किए गए हर रिकॉर्ड के लिए अपडेट किया जाएगा।
[DataType] कॉलम अपडेट किया गया है (लगभग 10% समय में 'X' को 'A' में बदल दिया गया है)।
[DataStatus] कॉलम 1% से कम समय में अपडेट किया जाता है।
अभी के लिए मेरा समाधान अलग प्रसंस्करण तालिका में संसाधित करने के लिए सभी रिकॉर्डों की प्राथमिक कुंजी का चयन करना है। मैं कुंजी को हटाता हूं क्योंकि मैं उन्हें संसाधित करता हूं ताकि सूचकांक के टुकड़े के रूप में मैं कम रिकॉर्ड के साथ काम कर रहा हूं।
हालाँकि, यह मेरे द्वारा किए जाने वाले वर्कफ़्लो को फिट नहीं करता है ताकि मैन्युअल हस्तक्षेप और महत्वपूर्ण डाउनटाइम के बिना इन डेटा को लगातार संसाधित किया जा सके। मैं हाउसकीपिंग कोर के लिए त्रैमासिक आधार पर डाउनटाइम का अनुमान लगाता हूं। लेकिन अब, अलग प्रोसेसिंग टेबल के बिना, मैं ऐसा नहीं कर पा रहा हूं कि विखंडन के बिना सेट किए गए डेटा का आधा भी इतना खराब हो जाए जितना कि इंडेक्स को रोकना और पुनर्निर्माण करना आवश्यक है।
अनुक्रमण या एक अलग डेटा मॉडल के लिए कोई सिफारिशें? क्या कोई पैटर्न है जिस पर मुझे शोध करने की आवश्यकता है?
मेरे पास डेटा मॉडल और प्रक्रिया सॉफ़्टवेयर का पूरा नियंत्रण है, इसलिए तालिका से बाहर कुछ भी नहीं है।