欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sql优化

程序员文章站 2022-03-05 16:03:30
...

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