sql - Oracle Index is not used when compare timestamp with <= or >= -


i have indexes on 2 columns of type timestamp(2) start_date , end_date , query whare clause like:

where c.start_date <= sysdate   , sysdate <= c.end_date 

the explain plan makes table access full instead of index range scan.

-if change <= = index used.

-if change sysdate systimestamp it's worse in explain plan:

sys_extract_utc(internal_function(c.start_date))<=sys_extract_utc(systimestamp(6))  

with full scan again.

-using to_timestamp brings desired index range scan:

where c.start_date <= to_timestamp ('10-sep-02 14:10:10.123000', 'dd-mon-rr hh24:mi:ss.ff')          , to_timestamp ('10-sep-02 14:10:10.123000', 'dd-mon-rr hh24:mi:ss.ff') <= c.end_date 

but need use current date.

can explain why happens?

edit: these simplified versions of query, same behavior appears. explain plans.

explain plan          select *             communication c             c.campaign_start_date <= sysdate          , sysdate <= c.campaign_end_date; 

plan hash value: 4120205924

------------------------------------------- | id  | operation         | name          | ------------------------------------------- |   0 | select statement  |               | |   1 |  table access full| communication | ------------------------------------------- 

.

explain plan          select *             communication c             c.start_date = sysdate          , sysdate = c.end_date; 

plan hash value: 1474125303

------------------------------------------------------------------- | id  | operation                        | name                   | ------------------------------------------------------------------- |   0 | select statement                 |                        | |   1 |  table access index rowid     | communication          | |   2 |   bitmap conversion rowids    |                        | |   3 |    bitmap ,                    |                        | |   4 |     bitmap conversion rowids|                        | |   5 |      index range scan            | communication_start_dt | |   6 |     bitmap conversion rowids|                        | |   7 |      index range scan            | communication_end_td   | ------------------------------------------------------------------- 

did try today day in timestamp? to_timestamp ('27-oct-15 14:10:10.123000' ? doesnt make sense compare query using 2 different days.

my guess using current date , <= mean check of rows anyway. mean using index wont give benefit

try query.

select count(*) 

and

select count(*) .... c.start_date <= sysdate   , sysdate <= c.end_date 

if both count(*) similar mean there isnt benefit on using index because need scan full table anyway.


Comments

Popular posts from this blog

javascript - Chart.js (Radar Chart) different scaleLineColor for each scaleLine -

apache - Error with PHP mail(): Multiple or malformed newlines found in additional_header -

java - Android – MapFragment overlay button shadow, just like MyLocation button -