من برنامه های اجرای اوراکل را تجزیه و تحلیل می کنم و یک واقعیت حیرت انگیز را پیدا کردم. این پرس و جو را بررسی کنید. این نکته فقط برای نشان دادن این است که من یک فهرست دارم و انتظار دارم که 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