and b.c809000021 <> '关闭'
and b.c809000021 <> '已关闭'
and b.c809000021 <> '已作废'
这种写法同!= 会全表扫描
a<>'aa' 改成(a<'aa' or a>'aa')的形式,这样会用到索引:
and (b.c809000021 <'关闭' or b.c809000021 > '关闭')
and (b.c809000021 <'已关闭' or b.c809000021 > '已关闭')
and (b.c809000021 <'已作废' or b.c809000021 >'已作废')
能用in就不要用or
t.actor = '000000000000402' or t.actor = 'jiexianyuan'
第一个列子最好写成:b.c809000021 in (非关闭,已关闭这些的列)
建索引有几个原则:
过滤度高的字段放前面
过滤度低的字段不放到索引里面
尽量在第一列就过滤掉大部分数据
并不是所有用索引都会更快,要看条件的过滤能力,比如说你表有10W行,条件要取出9W行,那用索引就不见得比全表扫描快
对于频繁更新删除的表,索引树上会存在大量空节点,需要重建索引
extent数过多的表,需要通过alter table xxx move tablespace xxx的方式重建表
ORACLE执行计划的生成依赖于分析获取的数据,分析获取的数据直接同底层的数据分布相关
而RULE规则是直接根据SQL的语法来生成计划,不依赖于分析数据
实际中我遇到的extent数过多,索引存在很多空节点,select选取的列数过多,都会导致查询计划不对
临时的解决方法就是使用HITS。长远的话还是用脚本定期rebuild索引,move表,analyze表和索引。
HITS强制索引里面要用别名:
select /*+INDEX(B I85_809000021_1)*/ distinct C700000003 workSheetId,
0 stepDescId,
'' taskId......
但是,再查看执行计划虽然COST多了,但是SQL的执行速度快了
原因是COST是预估值,说明他计算有问题
阅读(660) | 评论(0) | 转发(0) |