sql优化

sql优化

前言

      针对oracle,说一些写sql的优化。

 

 

oracle优化器

    Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的(相对而言)。

 

Optimizer 对ORACLE的优化方式有两种,一种是基于规则的,我们称为RBO(Rule-Based Optimization),一种是基于代价的CBO(Cost-Based Optimization),我们从字面就可基本理解这两个优化方式的含义,RBO是根据ORACLE的内定规则实现的,索引就是ORACLE的内定规则;而对于CBO,由于是基于代价的,也就是ORACLE机器的资源了,比如CPU和内存等

 

不一定走索引就是优的 ,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时对这个表做全表扫描是最好的。

 

优化器的优化模式(Optermizer Mode),包括Rule,Choose,First rows,All rows这四种方式
   
    Rule:不用多说,即走基于规则的方式。
    Choolse:这是我们应观注的,默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
    First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。
    All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走基于规则的方式。

 

 

我们可以通过在init.ora文件中设定OPTIMIZER_MODE=RULE、OPTIMIZER_MODE=CHOOSE、OPTIMIZER_MODE=FIRST_ROWS、OPTIMIZER_MODE=ALL_ROWS去选用3所提的四种方式,如果你没设定OPTIMIZER_MODE参数则默认用的是Choose这种方式。

规则

1、sql解析后会放在共享池,当共享池超过大小或者sql长久不适用sql可能从常量池删除掉。 所以我们写sql的时候一定要规范,这样我们可以利用共享池,避免多次解析。

 

2、RBO方式,是从右向左检索表,我们选择表的记录数少的放在最后面作为基础表。3个以上的表,选择交叉表放在最后面,作为基础表。

 

3、where 条件解析的方式是自下而上,所以能过滤条件最多的放在最后面。

 

4、oracle左右连可以通过(+)的方式实现。

 

5、同名尽量使用别名,避免数据库去解析

 

6、当in() 条件表达式不确定的时候尽量使用EXISTS

 

7、使用>=替代> 如(>=4 替代 >3)

 

8、使用union all代替 union (会做一个排序)

 

9、having是在检索完数据后,再过滤条件

索引失效

1、 避免索引列上使用计算

 

2、避免索引列上使用not

 

3、避免索引列上用isnull 和 is not null

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值