针对oracle,说一些写sql的优化。
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