एक निहित रूपांतरण किसी अनुक्रमणिका को अनुकूलक द्वारा उपयोग किए जाने से रोक सकता है। विचार करें:
SQL> CREATE TABLE a (ID VARCHAR2(10) PRIMARY KEY);
Table created
SQL> insert into a select rownum from dual connect by rownum <= 1e6;
1000000 rows inserted
यह एक साधारण तालिका है लेकिन डेटाटाइप 'सही' नहीं है, यानी यदि आप इसे इस तरह से पूछते हैं तो यह पूर्ण स्कैन होगा:
SQL> select * from a where id = 100;
ID
----------
100
यह क्वेरी वास्तव में इसके बराबर है:
select * from a where to_number(id) = 100;
यह अनुक्रमणिका का उपयोग नहीं कर सकता क्योंकि हमने id
. को अनुक्रमित किया है और नहीं to_number(id)
. यदि हम अनुक्रमणिका का उपयोग करना चाहते हैं तो हमें स्पष्ट . होना होगा :
select * from a where id = '100';
पाकर की टिप्पणी के जवाब में: निहित रूपांतरणों से संबंधित बहुत सारे नियम हैं। शुरू करने के लिए एक अच्छी जगह है दस्तावेज़ीकरण . अन्य बातों के अलावा, हम सीखते हैं कि:
इसका मतलब है कि जब एक "WHERE column=variable"
. के दौरान निहित रूपांतरण होता है क्लॉज, ओरेकल कॉलम के डेटाटाइप को कन्वर्ट करेगा न कि वेरिएबल के, इसलिए इंडेक्स को इस्तेमाल होने से रोकता है। यही कारण है कि आपको हमेशा सही प्रकार के डेटाटाइप का उपयोग करना चाहिए या चर को स्पष्ट रूप से परिवर्तित करना चाहिए।
Oracle दस्तावेज़ से: