Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Perbedaan rencana eksekusi yang tidak dapat diabaikan dengan Oracle saat menggunakan Stempel Waktu atau Tanggal jdbc

Jadi masalahnya, stempel waktu Oracle dan tanggal Oracle adalah dua tipe data yang berbeda. Untuk membandingkan stempel waktu dengan tanggal, Oracle harus menjalankan konversi - INTERNAL_FUNCTION() itu. Keputusan desain yang menarik adalah Oracle mengonversi kolom tabel daripada nilai yang diteruskan, yang berarti kueri tidak lagi menggunakan indeks.

Saya telah dapat mereproduksi skenario Anda di SQL*Plus, jadi tidak masalah dengan menggunakan java.sql.Timestamp . Mentransmisikan stempel waktu yang diteruskan ke tanggal memang menyelesaikan masalah...

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>

Tapi saya rasa itu tidak membantu Anda:akan lebih mudah untuk melewatkan tanggal saja.

Menariknya, membangun indeks berbasis fungsi yang mentransmisikan kolom tanggal ke cap waktu tidak membantu. INTERNAL_FUNCTION() panggilan tidak dikenali sebagai CAST() dan indeks diabaikan. Mencoba membuat indeks menggunakan INTERNAL_FUNCTION() melemparkan 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. Migrasi Lambat Ke Cloud

  2. Oracle Database Explorer:Pelatihan dan Akreditasi Gratis

  3. Bagaimana cara memeriksa apakah File adalah Gambar Menggunakan PL/SQL?

  4. Prosedur UTL_FILE.FOPEN() tidak menerima jalur untuk direktori?

  5. 2 Cara Memformat Angka dengan Nol Awal di Oracle