首先感谢大家情况如下:某表在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语句在首次生成执行计划时,走的是索引现在问题是什么样的变量值输入会导致这两个语句在第一次解析时,
生成不同性质的执行计划?
这个表里面最老的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语句在首次生成执行计划时,走的是索引现在问题是什么样的变量值输入会导致这两个语句在第一次解析时,
生成不同性质的执行计划?
解决方案 »
- 请问下oracle有类似mysql “LOCK TABLE 表 WRITE”
- 下午被一问题卡住了:查询和“s001”号同学所学课程完全相同的其他同学的学号
- asp+oracle 字符过长如何解决?ORA-01704: 字符串文字太长
- 写一致??
- 在SQL Plus想输入日期,应在怎么输入
- 问个简单问题-sql server转oracle的问题(只有十分了)
- 送分,这样两个问题的语句在ORACLE里面怎么写
- 有关删除数据库的问题?谢谢!
- 初次使用sql*loader出错,请教!在线等待
- 求助:ora-06502:pl/sql:数字或值错误:字符到数值的转换错误ora06512在line 14
- oralce中实现类似many in many的语句
- 大师求助:下面的求出了一个月某字段的总数
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');