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 他可以设定索引扫描和全表扫表的一个比例值