Oracle database sql优化遇到的部分问题与解决方案、

前几天被别的项目组(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么、 我回答说不是、对方说没事没事、 有工作经验就好、 (心里开始纠结、要不要抽时间考一个呢、 )

—-位图索引、对于一列基数较少、大多字段都是重复的值、可以选择位图索引、

你可能感兴趣的:(Oracle,database)