求解绑定变量执行计划问题

yaoweijq 2012-02-01 04:50:41
首先感谢大家

情况如下:

某表在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语句在首次生成执行计划时,走的是索引

现在问题是什么样的变量值输入会导致这两个语句在第一次解析时,
生成不同性质的执行计划?
...全文
230 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
cowboyhn 2012-02-02
  • 打赏
  • 举报
回复
建议先查询出对应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');
jdsnhan 2012-02-02
  • 打赏
  • 举报
回复
这个比好难分析。需要知道总数据量,操作的数据量、执行频率等等内容。

你用dbms_xplan.display_awr包先分析一下二者的执行计划。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧