Large cost change in execution-plan why?
As far as I remember, 10g had issues with bind peeking, and symptoms are very similar to what you have.  I suspect that good plan picks index (MY_TABLE_MY_COL_01_DATE ) for fo.eventdate&gt;sysdate - :2 when value of variable was small, or it was very few rows that satisfy that condition according to statistics.  Then either due to statistics change, or you ran it with different value of variable, or sql got evicted from SGA, either it generated a new plan . You might try to check V$SQL_SHARED_CURSOR , it shows why a new cursor was generated.  In theory, optimizer should switch between FTS and index scan, but in my memory it never happened in 10g - once it chose FTS, it would keep using it.  If upgrading Oracle is not an option, I'd try using literal in this particular case instead of bind variables, i.e. fo.eventdate&gt;sysdate - 1 . (or maybe combine literals and bind variables to help optimizer, say if it's never greater than 10 days you can do fo.eventdate&gt;sysdate - 10 and  fo.eventdate&gt;sysdate - :2