हमने हाल ही में हमारे सिस्टम में से एक के साथ एक प्रदर्शन समस्या की खोज की है और मुझे लगता है कि मेरे पास ठीक है लेकिन मुझे यकीन नहीं है कि मेरी समझ सही है।क्या मेरी समझ "अलग चयन करें" सही है?
सरलतम रूप में, हमारे पास एक टेबल 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
में डुप्लिकेट नहीं हो सकते हैं यदि इसमें सभी प्राथमिक कुंजी घटक शामिल हैं। यदि ऐसा है, तो हम बस उचित रूप से दृश्य को बदल सकते हैं।