Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455064
  • 博文数量: 97
  • 博客积分: 3396
  • 博客等级: 中校
  • 技术积分: 996
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-25 13:14
文章分类

全部博文(97)

文章存档

2014年(1)

2013年(2)

2012年(7)

2011年(13)

2010年(18)

2009年(7)

2007年(10)

2006年(39)

分类: Oracle

2010-07-16 17:25:57

           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是预估值,说明他计算有问题
 
阅读(631) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~