当前位置:文档之家› 确保Oracle数据库sql语句高效执行的优化总结(一)

确保Oracle数据库sql语句高效执行的优化总结(一)

SQL 的优化主要涉及几个方面:
(1)相关的统计信息缺失或者不准确
(2)索引问题
(3)SQL的本身的效率问题,比如使用绑定变量,批量DML 采用bulk等,这个就考验写SQL的基本功了,这一点也是最主要的一点。

一、SQL 编写注意事项
1.1 查看SQL
对于生产环境上的SQL,可以从AWR 或者Statspack 报告中获取相关的SQL信息。

这部分参考:
查看SQL 的性能怎么样,最直接的工具就是通过执行计划,通过执行计划可以看到SQL 的执行路径,逻辑读,物理读等信息,可以这些信息,可以帮助我们判断SQL 是否还有优化的余地。

1.2 SQL 编写的具体注意事项
这部分工作是基本功。

在SQL 编写过程中,避免一些低效的写法,能将SQL 的效率提高几倍。

如:
与使用TRUNC 相比,使用TO_CHAR 所用的CPU 时间与前者相差一个数量级(即相差12倍)。

因为TO_CHAR 必须把日期转换为一个串,这要使用一
个更大的代码路径,并利用当前的所有NLS来完成这个工作。

然后必须执行一个串与串的比较。

另一方面,TRUNC 只需把后5 个字节设置为1.然后将两个7 字节的二进制数进行比较。

因此,如果只是要截断一个DATE 列,你将应该避免使用TO_CHAR。

1.3 多表关联方式
表之间的关联有如下三种方式:
(1)Nested Loop
Inner table 循环与outer table匹配,这种是表有索引,选择性较好,表之间的差距不大。

===》两层for 循环,小表匹配大表。

(2)Hash John
小表做hash ,放内存,然后拿大表的每条记录做hash,然后与之前小表的Hash 值匹配。

==》大表匹配小表。

(3)Sorted Merge Into
表有序,并且没有索引。

二. 相关理论说明
2.1 Oracle 优化器:CBO 和RBO
Oracle 的优化器有两种:
(1)RBO(Rule-BasedOptimization): 基于规则的优化器
(2)CBO(Cost-BasedOptimization): 基于代价的优化器
CBO(Cost Based Optimizer)的思路是让Oracle 获取所有执行计划相关的信息,通过对这些信息做计算分析,最后得出一个代价最小的执行计划作为最终的执行计划。

从10g开始,Oracle 已经彻底丢弃了RBO。

即使在表,索引没有被分析的时候,Oracle依然会使用CBO。

此时,Oracle 会使用一种叫做动态采样的技术,在分析SQL的时候,动态的收集表,索引上的一些数据块,使用这些数据块的信息及字典表中关于这些对象的信息来计算出执行计划的代价,从而挑出最优的执行计划。

当表没有做分析的时候,Oracle 会使用动态采样来收集统计信息,这个动作只有在SQL执行的第一次,即硬分析阶段使用,后续的软分析将不在使用动态采样,直接使用第一次SQL硬分析时生成的执行计划。

2.2 软解析和硬解析
Oracle对此SQL将进行几个步骤的处理过程:
1、语法检查(syntax check): 检查此sql的拼写是否语法。

2、语义检查(semantic check): 诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。

3、对sql语句进行解析(prase): 利用内部算法对sql进行解析,生成解析
树(parse tree)及执行计划(execution plan)。

4、执行sql,返回结果(execute and return)
其中解析分为:
Hard Parse:就是上面提到的对提交的Sql完全重新从头进行解析(当在Shared Pool中找不到时候将会进行此操作),总共有一下5个执行步骤:1:语法分析
2:权限与对象检查
3:在共享池中检查是否有完全相同的之前完全解析好的. 如果存在,直接跳过4和5,运行Sql, 此时算soft parse.
4:选择执行计划
5:产生执行计划
注:创建解析树、生成执行计划对于sql的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。

这就是在很多项目中,倡导开发设计人员对功能相同的代码要努力保持代码的一致性,以及要在程序中多使用绑定变量的原因。

Soft Parse:就如果是在Shared Pool中找到了与之完全相同的Sql解析好的结果后会跳过Hard Parse中的后面的两个步骤。

与解析相关的一个重要参数:cursor_sharing,它决定什么情况下使用相同的cursor,从某种意义上讲,决定是否需要进行解析,该参数有3个值:(1)FORCE
Allowsthe creation of a new cursor if sharing an existing cursor, or if the cursorplan is not optimal.
(2)SIMILAR
Causesstatements that may differ in some literals, but are otherwise identical, toshare a cursor, unless the literals affect either the meaning of the statementor the degree to which the plan is optimized.
(3)EXACT
Onlyallows statements with identical text to share the same cursor.
只有SQL 语句完全相同的情况下,才会使用相同的cursor,即执行计划。

2.3 执行计划
生成SQL的执行计划是Oracle在对SQL做硬解析时的一个非常重要的步骤,它制定出一个方案告诉Oracle在执行这条SQL时以什么样的方式访问数据:索引还是全表扫描,是Hash Join还是Nested loops Join等。

我们也可以使用OracleHint来强制的改变SQL的执行计划,当然Oracle 不建议这么做,因为只要统计信息正确的情况下,CBO的分析结果一般是正确的。

相关主题