2011-09-07 19 views
12
SELECT COUNT (*) 
    FROM rps2_workflow 
WHERE  workflow_added > TO_DATE ('01.09.2011', 'dd.mm.yyyy') 
     AND workflow_finished < TO_DATE ('wtf', 'dd.mm.yyyy') 
     AND workflow_status IN (7, 12, 17) 
     AND workflow_worker = 159 

मैं असफल करने के लिए इस क्वेरी, अमान्य तिथि की वजह से उम्मीद है, लेकिन यह रिटर्न 0अप्रत्याशित क्वेरी सफलता

इस प्रश्न के लिए योजना पता चलता है कि 8 वीं कदम पर अवैध खंड संसाधित है:

8 TABLE ACCESS BY INDEX ROWID TABLE RPS2.RPS2_WORKFLOW Object Instance: 1 Filter Predicates: ("WORKFLOW_STATUS"=7 OR "WORKFLOW_STATUS"=12 OR "WORKFLOW_STATUS"=17) AND SYS_EXTRACT_UTC("WORKFLOW_FINISHED")<SYS_EXTRACT_UTC(TO_DATE('wtf','dd.mm.yyyy')) Cost: 11 Bytes: 33 Cardinality: 1 CPU Cost: 8 M IO Cost: 10 Time: 1      

अगर हम बाहर टिप्पणी AND workflow_status IN (7, 12, 17) हालत - तो प्रत्याशित हम ORA-01858: a non-numeric character was found where a numeric was expected

मिलता है हम 012,318,861 बाहर टिप्पणीतब हमें उन रिकॉर्ड्स की मात्रा मिलती है जो उस परिस्थितियों में फिट होते हैं (> 0)

यह कैसे संभव है?

युपीडी:

संकेत /*+no_index(rps2_workflow) */ कुछ भी बदल नहीं करता है (जबकि योजना में हम देखते हैं कि fullscan किया जाता है)

SELECT STATEMENT ALL_ROWSCost: 254 Bytes: 31 Cardinality: 1 CPU Cost: 34 M IO Cost: 248 Time: 4  
2 SORT AGGREGATE Bytes: 31 Cardinality: 1  
    1 TABLE ACCESS FULL TABLE RPS2.RPS2_WORKFLOW Object Instance: 1 Filter Predicates: "WORKFLOW_WORKER"=159 AND ("WORKFLOW_STATUS"=7 OR "WORKFLOW_STATUS"=12 OR "WORKFLOW_STATUS"=17) AND SYS_EXTRACT_UTC("WORKFLOW_ADDED")>SYS_EXTRACT_UTC(TIMESTAMP' 2011-09-01 00:00:00') AND SYS_EXTRACT_UTC("WORKFLOW_FINISHED")<SYS_EXTRACT_UTC(TO_DATE('wtf','dd.mm.yyyy')) Cost: 254 Bytes: 31 Cardinality: 1 CPU Cost: 34 M IO Cost: 248 Time: 4 
+0

@ बोल्टक्लॉक: ए, टैग सूची के अंत में एसक्यूएल नहीं डाल सकता: -एस समस्या ओरेकल-विशिष्ट है, न सिर्फ एक सामान्य एसक्यूएल प्रश्न – zerkms

+0

मुझे लगता है कि अनुकूलक को कार्यकर्ता 15 9 के लिए कोई रिकॉर्ड नहीं मिला (इंडेक्स का उपयोग करके) 7, 12, या 17 की स्थिति के साथ, इसलिए यह बाकी की क्वेरी का मूल्यांकन करने से परेशान नहीं था। जब आप स्थिति जांच को हटाते हैं, तो कुछ रिकॉर्ड पाए जाते हैं, इसलिए इसे TO_DATE फ़ंक्शन का मूल्यांकन करने और त्रुटि का कारण बनने की आवश्यकता होती है। यह सुनिश्चित करने के लिए मुश्किल है कि क्वेरी ऑप्टिमाइज़र क्या कर रहा है ... – Sparky

+0

@ स्पार्की: अंतिम अनुच्छेद देखें - यदि हम क्वेरी के "गलत" टुकड़े को हटाते हैं - यह पंक्तियां देता है। मैंने एक पल में भी ऐसा सोचा, लेकिन ** ** ** निर्दिष्ट स्थिति वाले रिकॉर्ड हैं – zerkms

उत्तर

3

यह शायद पाया कि सभी अन्य शर्तों को पूरा करने के लिए हर रिकॉर्ड एक NULLworkflow_finished क्षेत्र की है।

और NULL की तुलना में कुछ भी अज्ञात है इसलिए इसे अन्य ऑपरेंड का मूल्यांकन करने की आवश्यकता नहीं है।

+1

+1 बस एक मामूली बिंदु: न्यूल की तुलना में कुछ भी अज्ञात है, झूठ नहीं है, हालांकि इससे कोई फर्क नहीं पड़ता यहाँ। –

7

अनुकूलक फैसला करता है कि यह करने की जरूरत नहीं है, तो एक फ़ंक्शन का मूल्यांकन करें, ऐसा नहीं होगा, इसलिए फ़ंक्शन कभी अपवाद नहीं फेंक देगा:

select 1 from dual where 1 = 1 OR to_date('asdasdasd','asdasdasdas') > sysdate ; 

     1 
---------- 
     1 

फ़ंक्शन उठाता है एक अपवाद केवल पता लगाएं कि क्या का मूल्यांकन किया जाता है:

SQL> select 1 from dual where 1 = 1 AND to_date('asdasd','asdas') > sysdate ; 
select 1 from dual where 1 = 1 AND to_date('asdasd','asdas') > sysdate 
                * 
ERROR at line 1: 
ORA-01821: date format not recognized 

हालांकि, पार्सर तय कर सकें कि स्थिर कि क्वेरी अमान्य है - समारोह तर्कों की गलत प्रकार है या क्वेरी अमान्य प्रकार है, तो है क्योंकि पहले अनुकूलक इसे एक स्विंग हो जाता है पार्सर एक अपवाद बढ़ा देंगे:

SQL> select 1 from dual where 1 = 1 or to_date('asdasdasd',0) > sysdate ; 
select 1 from dual where 1 = 1 or to_date('asdasdasd',0) > sysdate 
                 * 
ERROR at line 1: 
ORA-00932: inconsistent datatypes: expected DATE got NUMBER 


SQL> select 1 from dual where 1 = 1 or to_date('asdasdasd','asdasdasdas') > 42 ; 
select 1 from dual where 1 = 1 or to_date('asdasdasd','asdasdasdas') > 42 
                     * 
ERROR at line 1: 
ORA-00932: inconsistent datatypes: expected DATE got NUMBER 
+0

भले ही आप बिल्कुल सही हैं - यह कोई जवाब नहीं है। क्योंकि यह मुद्दा थोड़ा गहरा था (भविष्य के स्तर पर नहीं, बल्कि ऑपरेंड स्तर पर)। और एलेक्सिसडएम ने इसे सही ढंग से अनुमान लगाया है। +1 वैसे भी – zerkms

+0

आह, मैंने उत्तर देने से पहले सभी "और पढ़ें" टिप्पणियों के माध्यम से नहीं पढ़ा :) –

+0

लेकिन वैसे भी आपने बहुत अच्छा काम किया है। यह जानकारी निश्चित रूप से किसी और पाठक के लिए उपयोगी होगी। अगर एलेक्सिसडएम अपना जवाब नहीं देता है - मैं तुम्हारा जांच करूंगा (और "अजीब" व्यवहार के कारण मामला जोड़ देगा) – zerkms

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