首先感谢大家情况如下:某表在starttime和其他字段上建立了唯一索引(starttime ,other_column_name)
这个表里面最老的starttime数据会定期删除
会进来一些新的starttime数据
现在在访问这个表的starttime字段时,采用了绑定变量,类似于
 select min(starttime) from table_name where starttime > to_date(:v1,'yyyymmdd') and starttime < to_date(:v2,'yyyymmdd');
 
 select max(starttime) from table_name where starttime > to_date(:v1,'yyyymmdd') and starttime < to_date(:v2,'yyyymmdd');现在可能会出现以下情况:第一条select min语句执行时间很长
第二条select max语句执行很快由于在测试环境没有重现以上的情况,
根据oracle对绑定变量处理的逻辑,第一次的执行计划以后会一直用
所以我怀疑
select min语句在首次生成执行计划时,走的是全表扫描
select max语句在首次生成执行计划时,走的是索引现在问题是什么样的变量值输入会导致这两个语句在第一次解析时,
生成不同性质的执行计划?

解决方案 »

  1.   

    建议先查询出对应SQL的执行计划:
    select child_number,sql_id,sql_text from v$sql where sql_text like 'select min(starttime) from table_name where starttime %';
    select * from table(dbms_xplan.display_cursor('<sql_id>',<child_number>));若是执行计划的问题,再对表做下表分析:
    execute DBMS_STATS.gather_table_stats(ownname=>'<owner_name>',tabname=>'<table_name>',degree=>10,estimate_percent=>10,cascade=>true,no_invalidate => false);如果还不能走索引,可以增加索引提示强制走索引:
    select /*+ index(a index_name)*/ min(starttime) from table_name a where starttime > to_date(:v1,'yyyymmdd') and starttime < to_date(:v2,'yyyymmdd');
      

  2.   

    这个比好难分析。需要知道总数据量,操作的数据量、执行频率等等内容。你用dbms_xplan.display_awr包先分析一下二者的执行计划。