के लिए इंडेक्स किए गए व्यू पर धीमापन कहें कि मेरे पास टाइमकार्ड नामक एक बहुत लंबी तालिका (~ 35 मिलियन पंक्तियां) है जिसमें केवल 5 कॉलम (टेबलआईडी, कंपनीआईडी, यूजरआईडी, प्रोजेक्टआईडी, डेलीहॉर्ड्स वर्कड, एंट्रीडेट) हैं। यह एक बहुत सीधी अगली तालिका है जो प्रति कंपनी प्रति परियोजना कर्मचारियों के कामकाजी घंटे प्रति दिन रिकॉर्ड करती है।एसक्यूएल 2005
अब मुझे किसी भी कंपनी के लिए प्रति माह कर्मचारियों के कुल कार्य घंटे प्रति माह पता लगाने के लिए एक रिपोर्ट तैयार करने की आवश्यकता है। रिपोर्ट चलने पर आवश्यक एकत्रीकरण करने के बजाय, मैं एक टेबल जैसी डेटा संरचना बनाना चाहता हूं जिसमें पहले से ही सभी कंपनी/परियोजना/उपयोगकर्ता डेटा एकत्रित हो, इसलिए जब रिपोर्ट चलती है, तो मैं सीधे उस डेटा संरचना से पूछताछ कर सकता हूं ~ 35 मिलियन रिकॉर्ड के बाद से कुछ रन-टाइम एकत्रीकरण किए बिना कुछ मिनट लग सकते हैं।
तो मेरे पास 2 अलग-अलग तरीके हैं। एक मेरे अतिरिक्त कॉलम के रूप में (CompanyID, UserID, ProjectID, MonthlyHoursWorked, Month) के साथ एक अतिरिक्त भौतिक तालिका बनाएं और अतिरिक्त तालिका में मानों को संशोधित करने के लिए टाइमकार्ड तालिका पर ट्रिगर का उपयोग करें। या मैं एक अनुक्रमित दृश्य बना सकते हैं। तो मैंने दोनों की कोशिश की। मैंने पहले निम्नलिखित कोड के साथ अनुक्रमित दृश्य की कोशिश की:
CREATE VIEW [dbo].[vw_myView] WITH SCHEMABINDING AS
SELECT
JobID,
ProjectID,
Sum(DailyHoursWorked) AS MonthTotal,
DATEADD(Month, DATEDIFF(Month, 0, entryDate), 0) AS entryMonth,
CompanyID,
COUNT_BIG(*) AS Counter
FROM
dbo.TimeCard
Group By DATEADD(Month, DATEDIFF(Month, 0, entryDate), 0), JobID, ProjectID, CompanyID
Go
CREATE UNIQUE CLUSTERED INDEX [IX_someIndex] ON [dbo].[vw_myView]
(
[CompanyID] ASC,
[entryMonth] ASC,
[UserID] ASC,
[ProjectID] ASC
)
अनुक्रमित दृश्य सही ढंग से बनाया गया और कुल ~ 5 मिलियन पंक्तियों के साथ कुल मिलाकर।
हालांकि, हर बार यदि मैं SQL कैश साफ़ करता हूं, और निम्न क्वेरी चलाता हूं: * vw_myView से * चुनें * जहां कंपनी आईडी = 1 *, इसमें लगभग 3 मिनट लगते हैं। यदि मैं ऊपर वर्णित अतिरिक्त तालिका मार्ग के साथ जाता हूं, तो मेरे कैश को साफ़ करने के साथ, इसमें लगभग 4 सेकंड लगते हैं।
मेरे प्रश्न हैं, इंडेक्स किया गया है इस विशेष परिदृश्य के लिए एक खराब विकल्प देखें? विशेष रूप से मुझे यह जानने में दिलचस्पी है कि क्या संपूर्ण अनुक्रमित दृश्य को हर बार फिर से गणना/पुन: एकत्रित किया जाता है जब अंतर्निहित तालिका (टाइमकार्ड) बदल जाती है या जब कोई क्वेरी इसके खिलाफ चलती है?
धन्यवाद!
SQL सर्वर 2005 का आप किस संस्करण का उपयोग कर रहे हैं? – RedFilter
आपके 'एंट्री मॉन्थ' में महीने के पहले दिन की पूरी तिथि होने के बजाय, क्या आपके पास अभी तक 'माह (एंट्रीडेट)' और संभवतः 'वर्ष (एंट्रीडेट)' नहीं हो सकता है? मेरे लिए बहुत आसान लगता है (लेकिन फिर से - मुझे आपकी सटीक आवश्यकताओं को नहीं पता) .... –