数据库-Oracle性能优化

                当我需要去做优化时,有一个固定的优化思路:sql语句优化->索引优化->分区优化->优化器hints优化

        1.sql语句的优化,我会顺着sql语句看下去:

        如有有子查询但是没有with as 临时表,优先考虑用with as临时表,来代替子查询,不仅增加代码的易读性,更重要的是临时表是一次扫描,多次使用,这也是提升性能的原因-达到了'少读'的目标;

        再往下看的话,就是select,select后面避免使用*,查什么字段就写什么字段,因为使用*是走全表扫描的,不走索引,这种是基于经验去判断走的是索引还是全表扫描,求证还是会去打开查看执行计划,去确认走系统走的是索引还是全表扫描;

        然后就是from,如果from后面接了多张表的话,调整为最有效率的表名顺序,oracale的解析器按照从右到左的顺序处理FROM子句中的表名,所以把数据记录最少的放在最后面,如果有三张表以上的表,那就把交叉表放在最后面;

        再就是join,join 之前先去重或者过滤一下,这样join时连接表的数据量更少,连接过程就优化了;

        然后where过滤也是有顺序的,优先吧过滤数据更多的条件放在最后面,避免去使用模糊查询like,in,exists,not等以及避免一些索引列上进行计算,这类情况下会造成索引失效,走全表扫描,增加I/O读取次数。

        2.索引的优化,需要考虑到的哪些列需要建索引,哪些不需要建索引:

        需要建索引的情况,经常需要搜素的列,建索引可以加快查询速度,经常需要join连接的列,建索引可以加快连接速度,经常使用where的子句中的列,建索引可以加快判断速度,经常group by,order by 的列,建索引可以加快排序的速度;

        相反,那些很少查询的列,数据值很少的列,经常进行数据修改的列等等就不适合建索引,如果增加索引会增加空间需求和降低系统的维护速度,一般来说一张表里最多不会建超过5个的索引。

        3.表分区的优化,分区的目的是为了避免全表扫描,到达提升查询速度的效果

        如果原表是没有建分区的话,会考虑重新创建一个一模一样的表并选择合理的分区方式,分区的方式有范围分区,列表分区,哈希分区,组合分区,复合分区,然后再把数据导进来,alter table rename 来修改原表名字成为历史表,再修改新表名字成为需求表。(如果数据量过于大了,可以先考虑先分表再分区提升性能,分表是通过定时任务,使用存储过程执行动态sql实现每年or每半年,每季度,根据实际情况来定,进行分表存储,每年的数据存储在对应的分表之中,如果数据量还是大,就要考虑到分区了,这个时候可以选择按月分区。)

        4.优化器hints的优化,写hints的目的是人为的去改变sql语句的执行计划,思路有并行数,表连接的顺序、表连接的方法、访问路径 等,通过查看执行计划了解执行顺序,扫描方式,关联机制,耗费来进行调整,比如说数据库性能足够的时候考虑会用到并行数,在select后用paralle加上合理的并行数,可以达到优化的目的。(基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA(数据库管理员)的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。例如,如果我们认为对于一个特定的语句,执行全表扫描要比执行索引扫描更有效,则我们就可以指示优化器使用全表扫描。在Oracle中,是通过为语句添加 Hints(提示)来实现干预优化器优化的目的。)

        

        

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值