前几天被别的项目组(RRSWLSQM)借去帮忙、 因为项目临近上线、 为了确保系统稳定、 一批问题sql需要优化
ALTER SYSTEM FLUSH SHARED_POOL ;
ALTER SYSTEM FLUSH BUFFER_CACHE ;
ALTER SYSTEM FLUSH GLOBAL CONTEXT;
清楚缓存、 测试速度
1、索引能解决绝大部分select 慢的问题、
拿到sql、看执行计划、看开销、 哪里开销比较大、 如果是(TABLE ACCESS FULL)全表扫描、考虑适不适合走索引、
如果应该走索引、 考虑为何不走索引、 索引的种类有很多、 此次调优种用到的:普通的B-tree 索引、函数索引、位图索引、组合索引、
—一条合适的索引会让你的select速度提高很多很多、
2、select查询中、 多表关联、小表驱动大表效率更好、
例如:
select a1,*,c.* from ( select a.id,a.strtus,b.name from a,b where a.id=b.id) a1 ,c where a1.strtus in ('1','2','3') and a1.id=c.id
可以改成:
select a1,*,c.* from ( select a.id,a.strtus,b.name from a,b where a.id=b.id and a.strtus in ('1','2','3') ) a1 ,c where a1.id=c.id
执行效率会更好、
3、执行计划不一定准确、 要看实际情况(我也不确定、 我认为是这样的、)
在优化sql中、 遇到一个where后多个条件、 我创建了组合索引、 没有效果、 执行计划没有选择走索引、 但是最后筛出的数据不多、 应该是走索引的、 我的索引创建的有问题、 where条件中有一个是mod(id,3)=:1
所以选择创建如下函数索引:
create index INDEX_NAME on TABLE_NAME (MOD (id, 3))
tablespace WLSQM_TBS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
在执行计划中查看、 耗费小了很多、
但是实际执行后发现执行的时间并没有什么明显的变化、
原因不明、目前是在压测库测试、决定拿到生产上测试下看看效果、
4、oracle数据库处理null是个问题、 优化过程中、遇到几个工作流表、
数据量大、 null值也特别多、 where条件过滤后数据量还是很大、 B-tree 索引创建后、执行计划不走索引、
加了hit强制走索引、 发现开销更大、
考虑了下null值的问题、 搜到了一篇文章https://blog.csdn.net/flexes/article/details/10762565 学到很多、 但是和我遇到的实际情况不符、 问题没有什么实质的进展、
然后在一个strtus_flag字段创建了位图索引 查询速度有明显提升、 但是因为工作流表涉及到频繁插入更改、 索引没有选择位图索引、问题暂时被搁置、让开发看看代码层可不可以改动下、
——null值的处理、最好在代码层直接解决掉、、
刚去帮忙的时候、 被问到、是OCP么、 我回答说不是、对方说没事没事、 有工作经验就好、 (心里开始纠结、要不要抽时间考一个呢、 )
—-位图索引、对于一列基数较少、大多字段都是重复的值、可以选择位图索引、