2011-04-22 11 views
5

मेरे पास स्वयं शामिल होने वाली एक तालिका है। संगठनात्मक पदानुक्रम का प्रतिनिधित्व करने के लिए आप मानक तालिका के रूप में संरचना के बारे में सोच सकते हैं। उदाहरण के लिए: -पुनरावर्ती प्रश्नों के लिए सीटीई अनुकूलित करना

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 मिनट लगती है!

सदस्य आईडी तालिका में प्राथमिक कुंजी है।

अग्रिम में :)

उत्तर

8

अपने लंगर हालत में धन्यवाद आप Where IsNull(MemberId,0) = IsNull(@MemberId,0) है मुझे लगता है यह है सिर्फ इसलिए कि जब आप एक पैरामीटर के रूप में NULL पारित = वापस IS NULL मूल्यों लाने के मामले में काम नहीं करता। यह एक खोज के बजाय एक स्कैन का कारण बन जाएगा।

WHERE MemberId = @MemberId OR (@MemberId IS NULL AND MemberId IS NULL) का उपयोग करें, जिसके बजाय sargable है।

यह भी मान रहा है कि आपके पास RelatedMemberId पर कोई अनुक्रमणिका नहीं हो सकती है। आप एक

CREATE NONCLUSTERED INDEX ix_name ON Members(RelatedMemberId) INCLUDE (MemberId) 

जोड़ना चाहिए यदि नहीं (हालांकि आप शामिल स्तंभ बिट को छोड़ सकते हैं अगर MemberId क्लस्टर सूचकांक कुंजी के रूप में यह स्वचालित रूप से शामिल हो जाएगा)

संबंधित मुद्दे