LIKE पैटर्न-मिलान स्थिति चरित्र प्रकारों को लेफ्ट-साइड और राइट-साइड ऑपरेंड दोनों के रूप में देखने की अपेक्षा करता है। जब इसका सामना NUMBER से होता है, तो यह स्पष्ट रूप से इसे चार में बदल देता है। आपकी क्वेरी 1 मूल रूप से चुपचाप इस पर फिर से लिखी गई है:
SELECT a1.*
FROM people a1
WHERE TO_CHAR(a1.id) LIKE '119%'
AND ROWNUM < 5
आपके मामले में ऐसा होता है, और यह दो कारणों से खराब है:
- रूपांतरण प्रत्येक पंक्ति के लिए किया जाता है, जो धीमा है;
- WHERE विधेय में एक फ़ंक्शन (हालांकि निहित) के कारण, Oracle
A1.ID
पर अनुक्रमणिका का उपयोग करने में असमर्थ है कॉलम।
इससे निजात पाने के लिए, आपको निम्न में से एक करना होगा:
-
एक फ़ंक्शन-आधारित अनुक्रमणिका बनाएं
A1.ID
. पर कॉलम:CREATE INDEX people_idx5 ON people (TO_CHAR(id));
-
यदि आपको आईडी कॉलम के पहले 3 वर्णों पर रिकॉर्ड का मिलान करने की आवश्यकता है, तो NUMBER प्रकार का एक और कॉलम बनाएं जिसमें केवल ये 3 वर्ण हों और एक सादा = का उपयोग करें उस पर ऑपरेटर।
-
एक अलग बनाएं कॉलम
ID_CHAR
प्रकार काVARCHAR2
और इसेTO_CHAR(id)
से भरें . इसे अनुक्रमित करें औरID
. के बजाय उपयोग करें आपकेWHERE
. में हालत।बेशक यदि आप मौजूदा आईडी कॉलम के आधार पर एक अतिरिक्त कॉलम बनाना चुनते हैं, तो आपको उन 2 को सिंक्रोनाइज़ करना होगा। आप इसे बैच में सिंगल UPDATE के रूप में, या ON-UPDATE ट्रिगर में कर सकते हैं, या उस कॉलम को उपयुक्त में जोड़ सकते हैं। अपने कोड में INSERT और UPDATE स्टेटमेंट।