Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle 12c - 'वर्चर' कॉलम पर इंडेक्स की तुलना में 'नंबर' कॉलम पर इंडेक्स तेजी से प्रदर्शन कर रहा है?

[TL;DR] तारीखों को संगृहीत करने के लिए तिथियों का, संख्याओं को संगृहीत करने के लिए संख्याओं और तारों को संगृहीत करने के लिए उपयोग करें।

Oracle NUMBER को स्टोर करता है डेटा प्रकार 1 बाइट प्रति 2 अंकों के रूप में।

Oracle CHAR को स्टोर करता है डेटा प्रकार 1 बाइट प्रति ASCII वर्ण के रूप में (UTF-8 और अन्य एन्कोडिंग विस्तारित सेट में वर्णों के लिए अधिक ले सकते हैं) और स्ट्रिंग को स्पेस वर्णों के साथ राइट-पैड करेंगे ताकि स्ट्रिंग्स बिल्कुल समान लंबाई की हों।

Oracle VARCHAR2 . को स्टोर करता है डेटा प्रकार 1 बाइट प्रति ASCII वर्ण और स्ट्रिंग लंबाई के लिए एक छोटा ओवरहेड (1 या 2 बाइट्स)।

Oracle DATE को स्टोर करता है डेटा प्रकार 7 बाइट्स के रूप में (वर्ष के लिए 2 और महीने, दिन, घंटे, मिनट, सेकंड में से प्रत्येक के लिए 1)।

आपके पिछले प्रश्न पर आधारित ऐसा प्रतीत होता है कि आप year storing संग्रहित कर रहे हैं और quarter और यह मानते हुए कि आपके पास हमेशा 4-अंकीय वर्ष और 1-अंकीय तिमाही होगी:

  • NUMBER(5,0) 3 बाइट लेगा;
  • CHAR(5 CHARACTER) 5 बाइट लेगा;
  • VARCHAR2(5 CHARACTER) 6 बाइट्स लेगा; और
  • DATE 7 बाइट लेगा।

तो केवल स्मृति को NUMBER(5,0) . मानते हुए सबसे कुशल होगा।

हालांकि

जैसे ही आप संख्या/स्ट्रिंग के रूप में संग्रहीत वर्ष/तिमाहियों पर अंकगणित करना शुरू करते हैं तो आप प्रदर्शन के मुद्दों में आ जाते हैं:

उदाहरण के लिए, अगली तिमाही प्राप्त करना:

  • यदि quarter एक NUMBER है डेटा प्रकार तो आप उपयोग कर सकते हैं:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END लेकिन जब आप 5 क्वार्टर जोड़ना चाहते हैं या क्वार्टर घटाना शुरू करते हैं तो यह संभाल नहीं पाता है और फिर तर्क बहुत अधिक जटिल होने लगता है।
  • यदि quarter एक CHAR है डेटा प्रकार तो आप इसे किसी संख्या या दिनांक में परिवर्तित कर सकते हैं और उन विधियों में से किसी एक का उपयोग कर सकते हैं (स्ट्रिंग हेरफेर के निष्पादक होने की संभावना नहीं है)।
  • यदि quarter एक DATE है तो आपको बस ADD_MONTHS( quarter, 3 ) . का उपयोग करने की आवश्यकता है ।

DATE विधि स्व-दस्तावेजीकरण है और पहले से मौजूद है जबकि NUMBER विधि आपके QUARTER . के आपके सन्निकटन के लिए केवल एक कस्टम फ़ंक्शन बन जाएगी डेटा प्रकार और एक बार जब आप सभी तुलना और हेरफेर कार्यों को लागू कर लेते हैं, तो आपको DATE को प्रभावी ढंग से फिर से लिखना होगा तिमाहियों के लिए यूडीटी के रूप में डेटा प्रकार और वे कार्य अनुकूलित दिनांक कार्यों की तुलना में कम प्रभावशाली होंगे।

अनुपयुक्त डेटा प्रकारों का उपयोग न करें - बस तिथियों को तिथियों के रूप में संग्रहीत करें; संख्या के रूप में संख्या; और स्ट्रिंग के रूप में स्ट्रिंग।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01722:इकाई फ्रेमवर्क पर अमान्य संख्या

  2. DBA_TABLES से गणना (*) बनाम NUM_ROWS द्वारा तालिका की Oracle पंक्ति गणना

  3. असमर्थित कॉलम डेटाटाइप ODP.NET

  4. देखने पर सूचकांक (ओरेकल)

  5. Oracle regexp_replace में रेगेक्स द्वारा अल्पविराम से अलग की गई सूची से डुप्लिकेट कैसे निकालें?