2010-07-07 13 views
9

में मुझे यह समझाया गया है कि इस Oracle 9i क्वेरी के अंत में +0 मतलब है कोशिश कर रहा हूँ एक आदेश के बाद मतलब है:क्या +0 द्वारा ओरेकल

SELECT /*+ INDEX (a CODE_ZIP_CODE_IX) */ 
     a.city, 
     a.state, 
     LPAD(a.code,5,0) ZipCode, 
     b.County_Name  CoName, 
     c.Description  RegDesc, 
     d.Description  RegTypeDesc 
FROM TBL_CODE_ZIP a, 
    TBL_CODE_COUNTY b, 
    TBL_CODE_REGION c, 
    TBL_CODE_REGION_TYPE d 
WHERE a.City = 'LONDONDERRY' 
    AND a.State = 'NH' 
    AND lpad(a.Code,5,0) = '03038' 
    AND a.Region_Type_Code = 1 
    AND b.County(+) = a.County_Code 
    AND b.STATE(+) = a.STATE 
    AND c.Code(+) = a.Region_Code 
    AND d.Code(+) = a.Region_Type_Code 
ORDER BY a.Code +0 

कोई भी विचार?

नोट: मुझे नहीं लगता कि यह आरोही के साथ या अवरोही के बाद से मैं एएससी या desc a.Code और +0 के बीच नहीं जोड़ सकते हैं और मैं के बाद +0

+0

क्या यह एक अंतर्निहित रूपांतरण के कारण एक संख्यात्मक डेटा प्रकार में कोड को मजबूर करने का एक तरीका है? –

+0

a.Code को NUMBER (5) –

+0

के रूप में निर्दिष्ट किया गया है, कोड ठीक से निर्धारित होने के बाद चीजें स्पष्ट हो जाती हैं। – APC

उत्तर

8

+ 0 नियम आधारित अनुकूलक के दिनों में एक चाल था, जिसने संख्यात्मक कॉलम पर एक सूचकांक का उपयोग करना असंभव बना दिया। इसी तरह, उन्होंने अल्फान्यूमेरिक कॉलम के लिए || '' किया था।

आपकी क्वेरी के लिए, केवल यह निष्कर्ष निकालने के बाद मैं पहुंच सकता हूं कि इसका निर्माता प्रदर्शन के साथ संघर्ष कर रहा था। अगर (यह मेरी धारणा है) अनुक्रमणिका CODE_ZIP_CODE_IX TBL_CODE_ZIP (कोड) पर एक अनुक्रमणिका है, तो क्वेरी इसका उपयोग नहीं करेगी, भले ही इसे उपयोग करने के लिए संकेत दिया गया हो। निर्माता शायद इस बात से अवगत नहीं था कि ए.कोड के बजाय एलपीएडी (एकोड, 5,0) का उपयोग करके, इंडेक्स का उपयोग नहीं किया जा सकता है। खंड द्वारा एक आदेश अपने मध्यवर्ती परिणाम सेट लेता है - जो स्मृति में रहता है - और इसे टाइप करता है। इसके लिए कोई अनुक्रमणिका की आवश्यकता नहीं है। लेकिन + 0 के साथ ऐसा लगता है कि वह इसे अक्षम करने के बारे में सोच रहा था।

तो, उपयोग की जाने वाली चालें अप्रभावी थीं, और अब आप केवल भ्रामक हैं, जैसा कि आपने पाया है।

सम्मान, रॉब।

PS1: एलपीएडी (TO_CHAR (a.code), 5, '0') या TO_CHAR (a.code, 'fm00009') का उपयोग करना बेहतर है। फिर यह स्पष्ट है कि आप डेटाटाइप के साथ क्या कर रहे हैं।

PS2: आपकी क्वेरी को एलपीएडी (TO_CHAR (a.code), 5, '0') पर फ़ंक्शन आधारित इंडेक्स का उपयोग करने से लाभ हो सकता है, या जो भी अभिव्यक्ति आप अपने ज़िप कोड को बाएं पैड के लिए उपयोग करते हैं।

7

एएससी या desc जोड़ सकते हैं करना है है मेरे अनुमान होगा कि a.code एक VARCHAR2 है जिसमें एक संख्यात्मक स्ट्रिंग है, और +0 प्रभावी रूप से इसे NUMBER पर कास्टिंग कर रहा है, इसलिए अल्फा

के बजाय क्रम संख्यात्मक होगी, आपको एएससी/डीईएससी जोड़ने के बाद सक्षम होना चाहिए +0

+0

@ मार्कबकर कोड एक NUMBER (5) है ... अगर इससे मदद मिलती है। हालांकि, मैं एसी या desc निर्दिष्ट करने में सक्षम था और यह काम किया! –

+2

ऐसा करने का एक अजीब तरीका लगता है - क्या यह 'to_number (a.code)' का उपयोग करने के बजाय इसे करने का कोई फायदा है? – FrustratedWithFormsDesigner

+0

@FrustratedWithFormsDesigner - लिखने के लिए छोटा? अन्यथा कोई महत्वपूर्ण अंतर नहीं है (TO_NUMBER के साथ स्वरूपण नियंत्रण के अलावा)। –

3

नोट: मैंने यह जवाब हटा दिया था, क्योंकि मार्क बी तेज टाइपिस्ट था। हालांकि, मैंने इसे फिर से स्थापित किया है क्योंकि मुझे लगता है कि लुकास पोस्ट किए गए एसक्यूएल के अंतर्निहित इरादे से क्या हो सकता है यह दिखाने में कुछ मूल्य है।


मान लीजिए कि कोड एक VARCHAR2 कॉलम अंक (ज़िप कोड) हो रहा है। समस्या यह है कि वर्चर्स तारों के रूप में क्रमबद्ध नहीं हैं। कोड के लिए एक शून्य जोड़ने संख्या के लिए एक अंतर्निहित डाली spawns, और इसलिए संख्यानुसार सॉर्ट करता:

SQL> select id, code 
    2 from t72 
    3 order by code 
    4/

     ID CODE 
---------- ----- 
     1 1 
     2 11 
     3 111 
     4 12 

SQL> select id, code 
    2 from t72 
    3 order by code+0 
    4/

     ID CODE 
---------- ----- 
     1 1 
     2 11 
     4 12 
     3 111 

SQL> 

तो संग्रहीत कोड बाएं गद्देदार किया गया था शून्य तो डाली हैं आवश्यक नहीं किया गया है के साथ, के रूप में वे में क्रमबद्ध हैं वैसे भी संख्यात्मक आदेश।

जैसा कि अन्य ने देखा है, TO_NUMBER() का उपयोग करना बेहतर विकल्प होगा। +0 एक स्पष्ट कलाकार से कम स्पष्ट है, और इरादे के बारे में स्पष्ट होना हमेशा अच्छा होता है।

+0

'to_number (a.code)' का वही प्रभाव होगा, या क्या '+ 0' के साथ कोई अंतर है? – FrustratedWithFormsDesigner

+1

मुझे लगता है कि nnumber का एक ही प्रभाव होगा और पाठक के लिए अधिक स्पष्ट होगा। –

+0

+1 जो मैंने सुझाया था उसके उदाहरण के लिए –

1

क्या TBL_CODE_ZIP.Code पर कोई अनुक्रमणिका है? मैंने प्रश्नों को देखा है जो क्वेरी के उस हिस्से के लिए इंडेक्स का उपयोग करने से बचने के लिए ऑप्टिमाइज़र को मजबूर करने के लिए एक संख्या में 0 (या '' स्ट्रिंग में) जोड़ते हैं। (बेशक, एक सूचकांक का उपयोग करने से बचने का उचित तरीका एक उचित संकेत जोड़ना है)

शायद मूल लेखक को एक समस्या थी जहां ऑर्डर बीई को इंडेक्स स्कैन में अनुकूलित किया जा रहा था, जिससे क्वेरी धीमी गति से चलती थी; इसलिए उन्होंने एक अलग पहुंच पथ को मजबूर करने के लिए +0 जोड़ा और सामान्य प्रकार किया।

+0

हां, एक इंडेक्स है, जिसे CODE_ZIP_CODE_IX कहा जाता है जिसमें इसमें एक कोड है, और इस क्वेरी में हम उस इंडेक्स का उपयोग करने के लिए "संकेत" कर रहे हैं। जब मैं इसे +0 के साथ और बिना तुलना की व्याख्या योजना के माध्यम से देखता हूं तो योजनाएं समान होती हैं। –

+1

@ लुकास, हां यह जरूरी नहीं होगा * अब *। वैकल्पिक रूप से, डेवलपर को गलत धारणा हो सकती है कि इससे यह तेजी से बढ़ जाएगा क्योंकि "यह मेरे लिए पहले काम करता है" :) –

+0

मैं मानता हूं कि मेरे सहकर्मियों में से एक ने सोचा कि यह ओरेकल 8 के लिए कार्यान्वयन से बचा जा सकता है। अंतर्दृष्टि –

0

उत्तर के लिए सभी खेदों का फ़िसर्ट क्योंकि अब यह बहुत पुराना सवाल है। हालांकि +0 इस विशिष्ट क्वेरी के लिए इंडेक्स को अनदेखा करने के लिए आपके डेटाबेस का संकेत है (यदि यह एक कोड कॉलम पर है)

कुछ समय सूचकांक पुनर्प्राप्ति तेज बनाता है जबकि कुछ समय इसे ऑप्टिमाइज़र मोड के आधार पर बहुत धीमा कर देता है डेटाबेस।

तो अब आपके पास दो विकल्प हैं Iigther उपयोग +0 संकेत या इंडेक्स को हटाएं यदि यह एक कोड पर है तो आपको एक ही गति मिल जाएगी।

संबंधित मुद्दे