2010-05-03 11 views
6

हमने हाल ही में हमारे सिस्टम में से एक के साथ एक प्रदर्शन समस्या की खोज की है और मुझे लगता है कि मेरे पास ठीक है लेकिन मुझे यकीन नहीं है कि मेरी समझ सही है।क्या मेरी समझ "अलग चयन करें" सही है?

सरलतम रूप में, हमारे पास एक टेबल blah है जिसमें हम एक महत्वपूर्ण फ़ील्ड के आधार पर विभिन्न मान जमा करते हैं। मूल रूप है:

recdate date 
rectime time 
system varchar(20) 
count  integer 
accum1 integer 
accum2 integer 

इसके मुकाबले बहुत अधिक जमाकर्ता हैं लेकिन वे सभी एक ही रूप हैं। प्राथमिक कुंजी recdate, rectime और system से बना है।

जैसा कि तालिका में मूल्य एकत्र किए जाते हैं, दिए गए recdate/rectime/system के लिए गणना बढ़ी है और उस कुंजी के मान accumulators में जोड़े गए हैं। इसका मतलब है कि accumN/count का उपयोग करके औसत प्राप्त किया जा सकता है।

अब हम भी उस तालिका के रूप में निर्दिष्ट के दृश्य के इस प्रकार है:

create view blah_v (
    recdate, rectime, system, count, 
    accum1, 
    accum2 
) as select distinct 
    recdate, rectime, system, count, 
    value (case when count > 0 then accum1/count end, 0), 
    value (case when count > 0 then accum2/count end, 0) 
    from blah; 

दूसरे शब्दों में, दृश्य हमें एक्युमुलेटरों के औसत मूल्य के बजाय रकम से देता है। यह भी सुनिश्चित करता है कि हमें उन मामलों में विभाजित-शून्य-शून्य नहीं मिलता है जहां गिनती शून्य होती है (ये रिकॉर्ड मौजूद हैं और हमें उन्हें हटाने की अनुमति नहीं है इसलिए मुझे परेशान न करें कि वे बकवास हैं - आप गाना बजानेवालों के लिए प्रचार कर रहे हैं)।

हमने पाया है कि कर के बीच समय अंतर:

select distinct recdate from XX 

बहुत है कि क्या हम मेज या दृश्य का उपयोग पर निर्भर करता है। मैं तालिका के लिए 1 सेकंड और दृश्य के लिए 27 सेकंड (100K पंक्तियों के साथ) के अंतर के बारे में बात कर रहा हूं।

हमने वास्तव में इसे select distinct पर ट्रैक किया। ऐसा प्रतीत होता है कि डीबीएमएस वास्तव में डुप्लिकेट को हटाने के लिए सभी पंक्तियों को लोड और सॉर्ट कर रहा है। यह काफी उचित है, यही वह है जिसे हमने बेवकूफ तरीके से करने के लिए कहा था।

लेकिन मुझे पूरा यकीन है कि इस दृश्य में प्राथमिक कुंजी के प्रत्येक घटक शामिल हैं जिसका मतलब है कि डुप्लिकेट करना असंभव है। हमने तब से समस्या को मान्य कर दिया है, यदि हम अलग-अलग दृश्य के बिना एक और दृश्य बनाते हैं, तो यह अंतर्निहित तालिका के समान गति पर करता है।

मैं सिर्फ अपनी समझ की पुष्टि करना चाहता था कि select distinct में डुप्लिकेट नहीं हो सकते हैं यदि इसमें सभी प्राथमिक कुंजी घटक शामिल हैं। यदि ऐसा है, तो हम बस उचित रूप से दृश्य को बदल सकते हैं।

उत्तर

3

हां, distinct परिणामों के लिए पूछने में कोई बात नहीं है जब सभी प्राथमिक कुंजी तत्व शामिल होते हैं।

तालिका की प्राथमिक कुंजी बाधा पहले से ही उन स्तंभों में डुप्लिकेट को रोकती है, लेकिन आपका डीबीएमएस अभी भी टुपल्स को संसाधित करेगा ताकि यह सुनिश्चित हो सके कि वे अलग हैं।

2

यदि दृश्य सीधे एक तालिका से चयन कर रहा है और चयनित कॉलम का सबसेट तालिका पर अद्वितीय है तो यह निम्नानुसार है कि चयनित पंक्तियां मानों में अद्वितीय होंगी और विशिष्ट अनावश्यक है।

4

इस मामले में DISTINCT आपको कोई अच्छा काम नहीं कर रहा है क्योंकि अंतर्निहित तालिका पर प्राथमिक कुंजी बाधा के कारण आपके विशिष्ट फ़ील्ड पहले ही अद्वितीय होने की गारंटी दे रहे हैं।आप दृश्य को फिर से लिखने का प्रयास कर सकते हैं:

create view blah_v ( 
    recdate, rectime, system, count, 
    accum1, 
    accum2 
) as select 
     recdate, rectime, system, count, 
     case when count > 0 then accum1/count else 0 end, 
     case when count > 0 then accum2/count else 0 end, 
     from blah; 

साझा करें और आनंद लें।

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