当前位置: 代码迷 >> Oracle管理 >> select count(*) from tablexxx执行计划,该如何处理
  详细解决方案

select count(*) from tablexxx执行计划,该如何处理

热度:16   发布时间:2016-04-24 05:37:27.0
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 他可以设定索引扫描和全表扫表的一个比例值
  相关解决方案