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

अनुक्रमित संख्या कॉलम पर 'पसंद' का उपयोग कर ओरेकल क्वेरी, खराब प्रदर्शन

LIKE पैटर्न-मिलान स्थिति चरित्र प्रकारों को लेफ्ट-साइड और राइट-साइड ऑपरेंड दोनों के रूप में देखने की अपेक्षा करता है। जब इसका सामना NUMBER से होता है, तो यह स्पष्ट रूप से इसे चार में बदल देता है। आपकी क्वेरी 1 मूल रूप से चुपचाप इस पर फिर से लिखी गई है:

SELECT a1.*
  FROM people a1
 WHERE TO_CHAR(a1.id) LIKE '119%'
   AND ROWNUM < 5

आपके मामले में ऐसा होता है, और यह दो कारणों से खराब है:

  1. रूपांतरण प्रत्येक पंक्ति के लिए किया जाता है, जो धीमा है;
  2. WHERE विधेय में एक फ़ंक्शन (हालांकि निहित) के कारण, Oracle A1.ID पर अनुक्रमणिका का उपयोग करने में असमर्थ है कॉलम।

इससे निजात पाने के लिए, आपको निम्न में से एक करना होगा:

  1. एक फ़ंक्शन-आधारित अनुक्रमणिका बनाएं A1.ID . पर कॉलम:

    CREATE INDEX people_idx5 ON people (TO_CHAR(id));

  2. यदि आपको आईडी कॉलम के पहले 3 वर्णों पर रिकॉर्ड का मिलान करने की आवश्यकता है, तो NUMBER प्रकार का एक और कॉलम बनाएं जिसमें केवल ये 3 वर्ण हों और एक सादा = का उपयोग करें उस पर ऑपरेटर।

  3. एक अलग बनाएं कॉलम ID_CHAR प्रकार का VARCHAR2 और इसे TO_CHAR(id) से भरें . इसे अनुक्रमित करें और ID . के बजाय उपयोग करें आपके WHERE . में हालत।

    बेशक यदि आप मौजूदा आईडी कॉलम के आधार पर एक अतिरिक्त कॉलम बनाना चुनते हैं, तो आपको उन 2 को सिंक्रोनाइज़ करना होगा। आप इसे बैच में सिंगल UPDATE के रूप में, या ON-UPDATE ट्रिगर में कर सकते हैं, या उस कॉलम को उपयुक्त में जोड़ सकते हैं। अपने कोड में INSERT और UPDATE स्टेटमेंट।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस कॉलम में बिट फ़्लैग के लिए कोई नुकसान?

  2. डेटाटाइप xmltype के कॉलम पर ora_hash का उपयोग कैसे करें

  3. घंटे और मिनट में परिणाम प्राप्त करने के लिए ऑरैकल में 2 तिथियां कैसे घटाएं?

  4. क्या उपयोग के बाद DbCommand का निपटान करना आवश्यक है?

  5. SQL सर्वर से लिंक किए गए Oracle सर्वर प्रक्रियाओं के लिए स्ट्रिंग पैरामीटर पास करना