Oracle SQL优化 总结Oracle SQL优化 总结
之前的blog中零零散散的整理了一些优化相关的内容,找起来比较麻烦,所以总结一下,查看的时候方便一点。这篇BLog只看SQL 优化的相关的注意事项,数据库优化部分以后有空在整理。
SQL 的优化主要涉及几个方面:
(1) 相关的统计信息缺失或者不准确
(2) 索引问题
(3) SQL 的本身的效率问题,比如使用绑定变量,批量DML 采用bulk等,这个就考验写SQL的基本功了,这一点也是最主要的一点。
一.SQL 编写注意事项1.1 查看SQL
对于生产环境上的SQL,可以从AWR 或者 Statspack 报告中获取相关的SQL 信息。
这部分参考:
Oracle AWR 介绍
http://www.doczj.com/doc/62e5280b4a7302768e99391d.html/tianlesoftware/article/details/4682300
statspack安装使用 和report 分析
http://www.doczj.com/doc/62e5280b4a7302768e99391d.html/tianlesoftware/article/details/4682329
查看SQL 的性能怎么样,最直接的工具就是通过执行计划,通过执行计划可以看到SQL 的执行路径,逻辑读,物理读等信息,可以这些信息,可以帮助我们判断SQL 是否还有优化的余地。
1.2 SQL 编写的具体注意事项 这部分工作是基本功。 在SQL 编写过程中, 避免一些低效的写法,能将SQL的效率提高几倍。 如:
to_char(created,'yyyy') = '2011'
trunc(created,'y') = to_date('01-jan-2011','dd-mon-yyyy')
与使用TRUNC 相比,使用TO_CHAR 所用的CPU 时间与前者相差一个数量级(即相差12倍)。因为TO_CHAR 必须把日期转换为一个串,这要使用一个更大的代码路径,并利用当前的所有NLS来完成这个工作。然后必须执行一个串与串的比较。另一方面,TRUNC 只需把后5 个字节设置为1.然后将两个7 字节的二进制数进行比较。因此,如果只是要截断一个DATE 列,你将应该避免使用TO_CHAR。
之前从网上转载了一篇文章,链接如下:
Oracle SQL的优化
http://www.doczj.com/doc/62e5280b4a7302768e99391d.html/tianlesoftware/article/details/4672023
这是几年前转载的文章,其中内容有些也有误,这里就不更正了。
1.3 多表关联方式 表之间的关联有如下三种方式:
(1) Nested Loop
Inner table 循环与outer table匹配,这种是表有索引,选择性较好,表之间的差距不大。 ===》两层for 循环,小表匹配大表。
(2) Hash John
小表做hash ,放内存,然后拿大表的每条记录做hash,然后与之前小表的Hash 值匹配。==》大表匹配小表。
(3) Sorted Merge Into
表有序,并且没有索引。
具体参考:
多表连接的三种方式详解 HASH JOIN MERGE JOINNESTED LOOP
http://www.doczj.com/doc/62e5280b4a7302768e99391d.html/tianlesoftware/article/details/5826546
二. 相关理论说明2.1 Oracle 优化器:CBO 和 RBOOracle的优化器有两种:
RBO(Rule-BasedOptimization):基于规则的优化器
CBO(Cost-BasedOptimization):基于代价的优化器