تفاوت ناچیز تفاوت اجرای برنامه با اوراکل هنگام استفاده از jdbc Timestamp یا Date

من برنامه های اجرای اوراکل را تجزیه و تحلیل می کنم و یک واقعیت حیرت انگیز را پیدا کردم. این پرس و جو را بررسی کنید. این نکته فقط برای نشان دادن این است که من یک فهرست دارم و انتظار دارم که Oracle از آن برای اسکن های دامنه ای استفاده کند:

// execute_at is of type DATE.
PreparedStatement stmt = connection.prepareStatement(
    "SELECT /*+ index(my_table my_index) */ * " + 
    "FROM my_table " +
    "WHERE execute_at > ? AND execute_at < ?");

این دو اتصال منجر به رفتار کاملاً متفاوتی می شود (برای حذف موارد متغیر peeking متغیر ، من در واقع دو سخت افزار را اجرا کردم ):

// 1. with timestamps
stmt.setTimestamp(1, start);
stmt.setTimestamp(2, end);

// 2. with dates
stmt.setDate(1, start);
stmt.setDate(2, end);

1) با مهر زمان ، من INDEX FULL SCAN و بنابراین یک محمول فیلتر

--------------------------------------------------------------
| Id  | Operation                    | Name                  |
--------------------------------------------------------------
|   0 | SELECT STATEMENT             |                       |
|*  1 |  FILTER                      |                       |
|   2 |   TABLE ACCESS BY INDEX ROWID| my_table              |
|*  3 |    INDEX FULL SCAN           | my_index              |
--------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(:1<:2)"
   3 - filter((INTERNAL_FUNCTION(""EXECUTE_AT"")>:1 AND 
               INTERNAL_FUNCTION(""EXECUTE_AT"")<:2))

2) با تاریخ ، من INDEX RANGE SCAN بسیار بهتر می شوم و یک محمول دسترسی

--------------------------------------------------------------
| Id  | Operation                    | Name                  |
--------------------------------------------------------------
|   0 | SELECT STATEMENT             |                       |
|*  1 |  FILTER                      |                       |
|   2 |   TABLE ACCESS BY INDEX ROWID| my_table              |
|*  3 |    INDEX RANGE SCAN          | my_index              |
--------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(:1<:2)"
   3 - access(""EXECUTE_AT"">:1 AND ""EXECUTE_AT""<:2)

اکنون مثال من فقط یک مثال است. س realال واقعی بسیار پیچیده تر است ، در اینجا وجود RANGE SCANS یا UNIQUE SCANS (11147387] (بسته به محمول) به جای FULL SCANS ضروری است.

آیا چیزی وجود دارد که من در اینجا سوerstand تفاهم داشته باشم؟ آیا کسی می تواند به من بهترین راه حل / عمل را نشان دهد؟ زیرا در دنیای جاوا فکر می کنم java.sql.Timestamp بسیار مناسب تر است اما بیشتر ستون های ما از نوع Oracle DATE است. ما از Java 6 و Oracle 11g

12
задан Lukas Eder 7 July 2011 в 15:15
поделиться