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

jdbc टाइमस्टैम्प या दिनांक का उपयोग करते समय Oracle के साथ गैर-नगण्य निष्पादन योजना अंतर

तो बात यह है कि ओरेकल टाइमस्टैम्प और ओरेकल तिथियां दो अलग-अलग डेटाटाइप हैं। किसी टाइमस्टैम्प की किसी तिथि से तुलना करने के लिए Oracle को एक रूपांतरण चलाना होता है - वह INTERNAL_FUNCTION ()। दिलचस्प डिजाइन निर्णय यह है कि ओरेकल पास किए गए मान के बजाय टेबल कॉलम को परिवर्तित करता है, जिसका अर्थ है कि क्वेरी अब इंडेक्स का उपयोग नहीं करती है।

मैं SQL*प्लस में आपके परिदृश्य को पुन:पेश करने में सक्षम रहा हूं, इसलिए java.sql.Timestamp का उपयोग करने में कोई समस्या नहीं है। . पारित टाइमस्टैम्प को तारीखों में कास्ट करने से समस्या का समाधान हो जाता है...

SQL> explain plan for
  2      select * from test1
  3      where d1 > cast(to_timestamp('01-MAY-2011 00:00:00.000', 'DD-MON-YYYY Hh24:MI:SS.FF') as date)
  4       and d2 > cast(to_timestamp('01-JUN-2011 23:59:59.999', 'DD-MON-YYYY Hh24:MI:SS.FF') as date)
  5  /

Explained.

SQL> select * from table(dbms_xplan.display)
  2  /

PLAN_TABLE_OUTPUT
-----------------------------------------------------------
Plan hash value: 1531258174

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |    25 |   500 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST1 |    25 |   500 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T1_I  |     1 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------    
   2 - access("D1">CAST(TO_TIMESTAMP('01-MAY-2011 00:00:00.000','DD-MON-YYYY
              Hh24:MI:SS.FF') AS date) AND "D2">CAST(TO_TIMESTAMP('01-JUN-2011
              23:59:59.999','DD-MON-YYYY Hh24:MI:SS.FF') AS date) AND "D1" IS NOT NULL)
       filter("D2">CAST(TO_TIMESTAMP('01-JUN-2011 23:59:59.999','DD-MON-YYYY
              Hh24:MI:SS.FF') AS date))

18 rows selected.

SQL>

लेकिन मुझे नहीं लगता कि इससे आपको कोई मदद मिलती है:इसके बजाय सिर्फ तारीखें पास करना आसान होगा।

दिलचस्प बात यह है कि दिनांक कॉलम को टाइमस्टैम्प पर कास्टिंग करने वाले फ़ंक्शन-आधारित इंडेक्स का निर्माण करने से मदद नहीं मिलती है। INTERNAL_FUNCTION() कॉल को CAST() के रूप में पहचाना नहीं गया है और सूचकांक को नजरअंदाज कर दिया जाता है। INTERNAL_FUNCTION() . का उपयोग करके एक अनुक्रमणिका बनाने का प्रयास कर रहा है एक ORA-00904 फेंकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सबक्वेरी के साथ Oracle पिवट

  2. फिक्स:Oracle डेटाबेस में "अंतराल की अग्रणी सटीकता बहुत छोटी है"

  3. मैं Oracle पर SQL का उपयोग करके चालू वर्ष कैसे प्राप्त करूं?

  4. पर्ल डीबीडी ::ओरेकल मॉड्यूल स्थापना

  5. sql . में महीनों और दिनों दोनों में दो तिथियों के बीच अंतर प्राप्त करें