日期:2014-05-17  浏览次数:20883 次

select count(*) from tablexxx执行计划
table1的执行计划是 table access full,table2是index fast full scan 
二者都是有建index,两者有何区别呢?

对table1进行表分析,分析完执行计划一样是table access full。

在查询table1的时候

SQL code

WHERE A.CREATE_DATE >=
       TO_DATE('2012/01/11 20:00:00',
               'YYYY/MM/DD HH24:MI:SS') - 1
   AND A.CREATE_DATE <
       TO_DATE('2012/01/11 20:00:00',
               'YYYY/MM/DD HH24:MI:SS')


只查询一天的资料,走的是index range scan

SQL code

WHERE A.CREATE_DATE >=
       TO_DATE('2012/01/11 20:00:00',
               'YYYY/MM/DD HH24:MI:SS') - 1
   AND A.CREATE_DATE <
       TO_DATE('2012/01/15 20:00:00',
               'YYYY/MM/DD HH24:MI:SS')



若查询时间段拉长,就变成table access full了

------解决方案--------------------
这个应该是oracle的SQL自优化。

当你从table中查询出来的结果数量在某一个百分比范围内时,就走index。如果超过了这个范围,就直接全表扫。

根据我的经验,我一般在评估建索引的依据时,这个百分比定在10%。
------解决方案--------------------
ORACLE的优化器会根据运行的成本来选择查询方式
------解决方案--------------------
这个应该是ORACLE的优化器搞的
------解决方案--------------------
oracle 有个参数,optimizer_index_cost_adj 他可以设定索引扫描和全表扫表的一个比例值