मेरे पास स्वयं शामिल होने वाली एक तालिका है। संगठनात्मक पदानुक्रम का प्रतिनिधित्व करने के लिए आप मानक तालिका के रूप में संरचना के बारे में सोच सकते हैं। उदाहरण के लिए: -पुनरावर्ती प्रश्नों के लिए सीटीई अनुकूलित करना
MemberId
MemberName
RelatedMemberId
इस तालिका में 50000 नमूना रिकॉर्ड शामिल हैं। मैंने सीटीई रिकर्सिव क्वेरी लिखी और यह बिल्कुल ठीक काम करता है। हालांकि, 50000 रिकॉर्ड्स को संसाधित करने में लगने वाला समय मेरी मशीन पर लगभग 3 मिनट (4 जीबी राम, 2.4 गीगा कोर 2 डीओओ, 7200 आरपीएम एचडीडी) है।
मैं संभवतः प्रदर्शन में सुधार कैसे कर सकता हूं क्योंकि 50000 इतनी बड़ी संख्या नहीं है। समय के साथ यह बढ़ता रहेगा। यह वह प्रश्न है जो मेरे संग्रहित प्रक्रिया में बिल्कुल वैसा ही है। प्रश्न का उद्देश्य उन सभी सदस्यों का चयन करना है जो एक विशिष्ट सदस्य के अंतर्गत आते हैं। उदाहरण के लिए। कंपनी के मालिक के तहत प्रत्येक व्यक्ति आता है। प्रबंधक के लिए, मालिक को छोड़कर सभी रिकॉर्ड वापस आते हैं। मुझे उम्मीद है कि आप क्वेरी के उद्देश्य को समझेंगे।
पर सेट ANSI_NULLS सेट QUOTED_IDENTIFIER GO चलते-फिरते
Alter PROCEDURE spGetNonVirtualizedData
(
@MemberId int
)
AS
BEGIN
With MembersCTE As
(
Select parent.MemberId As MemberId, 0 as Level
From Members as parent Where IsNull(MemberId,0) = IsNull(@MemberId,0)
Union ALL
Select child.MemberId As MemberId , Level + 1 as Level
From Members as child
Inner Join MembersCTE on MembersCTE.MemberId = child.RelatedMemberId
)
Select Members.*
From MembersCTE
Inner Join Members On MembersCTE.MemberId = Members.MemberId
option(maxrecursion 0)
END
GO
आप प्रदर्शन में सुधार करने देख सकते हैं, मैं भी अंतिम चरण में शामिल करते हुए रिकॉर्ड का चयन इतना है कि सभी अनावश्यक रिकॉर्ड कर बना दिया है temp तालिका में डाला नहीं है। अगर मैंने अपने मूल चरण और सीटीई के रिकर्सिव चरण में शामिल किया है (अंतिम चरण में चयन करने के बजाय) क्वेरी निष्पादित करने में 20 मिनट लगती है!
सदस्य आईडी तालिका में प्राथमिक कुंजी है।
अग्रिम में :)