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

Oracle में sysdate के साथ तुलना करते समय दिनांक प्रकार कॉलम समस्या के लिए या जहां क्लॉज का उपयोग करना

खैर, मैं इसे दोहराने में सक्षम हूं और इस तरह के व्यवहार के पीछे ओरेकल की भविष्यवाणी की व्याख्या है।

OS और Oracle का संस्करण जहां इसे पुन:प्रस्तुत किया जा सकता है:

SQL> host ver

Microsoft Windows [Version 6.1.7601]

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL>

पहले मामले में विधेय को filter("D"."DT" IS NOT NULL) में संशोधित किया गया है जबकि दूसरी क्वेरी में, विधेय filter("D"."DT"<TO_DATE(' 2013-01-20 00:00:00', 'syyyy-mm-dd hh24:mi:ss') OR "D"."DT">[email protected]!)

SQL> select count(*)
  2  from aaa d
  3  where (d.dt > sysdate)
  4  or d.dt < to_date('20130120','yyyymmdd')
  5  /

  COUNT(*)
----------
        15

Execution Plan
----------------------------------------------------------
Plan hash value: 977873394

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     9 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |     9 |            |          |
|*  2 |   TABLE ACCESS FULL| AAA  |    15 |   135 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("D"."DT" IS NOT NULL)

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics

----------------------------------------------------------
      4  recursive calls
      0  db block gets
     15  consistent gets
      0  physical reads
      0  redo size
    346  bytes sent via SQL*Net to client
    364  bytes received via SQL*Net from client
      2  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
      1  rows processed

SQL> ed
Wrote file afiedt.buf

  1  select count(*)
  2  from aaa d
  3  where d.dt < to_date('20130120','yyyymmdd')
  4* or (d.dt > sysdate)
SQL> 
/

  COUNT(*)
----------
         7

Execution Plan
----------------------------------------------------------
Plan hash value: 977873394

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     9 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |     9 |            |          |
|*  2 |   TABLE ACCESS FULL| AAA  |     7 |    63 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("D"."DT"<TO_DATE(' 2013-01-20 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') OR "D"."DT">[email protected]!)

Note
-----
   - dynamic sampling used for this statement (level=2)

Statistics

----------------------------------------------------------
      4  recursive calls
      0  db block gets
     15  consistent gets
      0  physical reads
      0  redo size
    346  bytes sent via SQL*Net to client
    364  bytes received via SQL*Net from client
      2  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
      1  rows processed

SQL>

मैं Oracle के इस व्यवहार का पता नहीं लगा सका, बहुत संभव है कि कुछ विशेषज्ञ इसे समझा सकें।

तीसरे उदाहरण में फिर से, विधेय का सही उपयोग किया जाता है। filter("D"."DT"<TO_DATE(' 2013-01-20 00:00:00', 'syyyy-mm-dd hh24:mi:ss') OR INTERNAL_FUNCTION("D"."DT")+1>[email protected]!+1)

SQL> ed
Wrote file afiedt.buf

  1  select count(*)
  2  from aaa d
  3  where (d.dt + 1 > sysdate + 1)
  4* or d.dt < to_date('20130120','yyyymmdd')
SQL> /

  COUNT(*)
----------
         7

Execution Plan
----------------------------------------------------------
Plan hash value: 977873394

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     9 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |     9 |            |          |
|*  2 |   TABLE ACCESS FULL| AAA  |     7 |    63 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("D"."DT"<TO_DATE(' 2013-01-20 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') OR INTERNAL_FUNCTION("D"."DT")+1>[email protected]!+1)

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          5  recursive calls
          0  db block gets
         15  consistent gets
          0  physical reads
          0  redo size
        346  bytes sent via SQL*Net to client
        364  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

यह बिल्कुल स्पष्ट है कि इसे Linux सर्वर पर Oracle संस्करण 11.2.0.2.0 और 11.2.0.3.0 से पुन:प्रस्तुत नहीं किया जा सकता है।

अपडेट करें:

एलेक्स पूले . के रूप में टिप्पणियों में उल्लेख किया गया है - "यह बग 9495697 हो सकता है, 'गलत परिणाम एक क्वेरी के लिए लौटाए जा सकते हैं जिसमें दो OR'd फ़िल्टर एक ही कॉलम पर भविष्यवाणी करते हैं, जहां एक भविष्यवाणी का दूसरा पक्ष संकलन-समय स्थिर नहीं है (उदाहरण के लिए। यह एक बाँध है, sysdate, आदि..)"




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मुझे PL/SQL BEGIN...END ब्लॉक कब नेस्ट करना चाहिए?

  2. ओरेकल में एलटीआरआईएम () फ़ंक्शन

  3. Oracle JDBC:अमान्य उपयोगकर्ता नाम/पासवर्ड (ora-01017)

  4. JSON_TABLE का उपयोग करके Oracle JSON कॉलम से परिणाम के रूप में कुंजी मान कैसे प्राप्त करें

  5. ओरेकल एसक्यूएल स्क्रिप्ट स्पूल फाइल कैसे बनाएं