ORACLE 执行计划介绍与测试
(沈克勤)
2005-3-3
1.目的:
本文档的目的是通过介绍常用的HINT来了解ORACLE的优化器的工作原理及执行计划,以期望起到抛砖引玉的作用。在实际开发中有意识地控制SQL的执行计划,以达到SQL 执行性能的最优以及执行计划稳定。
为了减少枯燥的文档描述,使用了较多的图示。
2.如何查看执行计划
首先创建EXPLAIN_PLAN表
不同版本的ORACLE,该表结构可能会不同。请使用的ORACLE中
$ORACLE_HOME/rdbms/admin/utlxplan.sql去创建该表。
方法1:使用SQL*PLUS 的SET AUTOTRACE :
sql优化的几种方式SQL>SET AUTOTRACE ON EXPLAIN 执行SQL,且仅显示执行计划
SQL>SET AUTOTRACE ON STATISTICS 执行SQL,且仅显示执行统计信息
SQL>SET AUTOTRACE ON 执行SQL,且显示执行计划与执行统计信息SQL>SET AUTOTRACE TRACEONLY 仅显示执行计划与统计信息,无执行结果SQL>SET AUTOTRACE OFF 关闭跟踪显示计划与统计
方法2:使用PL/SQL Developer工具
方法3:使用DBMS_XPLAN.DISPLAY()
方法4:直接查看表:EXPLAIN_TABLE
SELECT lpad(' ',level-1)||operation||' '||options||' '||
object_name "Plan"
FROM plan_table
CONNECT BY prior id = parent_id
AND prior statement_id = statement_id
START WITH id = 0AND statement_id = '&1'
ORDER BY id;
3.如何控制与改变执行计划
我并没有见过单独介绍ORACLE SQL优化器原理方面的资料。但可以从ORACLE的HINT这个侧面来了解ORACLE的优化器的原理,从而最有效地书写SQL。
方法1:使用ORACLE的HINT
ORACLE的HINT是用来提示ORACLE的优化器,以期选择用户期望的执行计划。在许多情况下,ORACLE默认的执行方式并不总是最优的,只不过我们平时大多数所操作的数据量比较小,好的执行
计划与差的执行计划所消耗的时间上的差很少,用户感觉不到而已。但于对书写操作大数据量的SQL而言,其SQL的书写则需要先了解一下执行计划是否最优或满足生产需要。通常从开发环境迁移到生产环境下时,往往会出现此类情况。
例如:假设有一张客户表,在客户类别上有索引。如果想查某一类别用户,而该类别用户占总数的比例高达90%,则此时采用全表扫描方式将会比索引扫描方式快。如果不使用HINT,ORACLE很可能会选择使用索引方式来执行。
使用HINT可以:
1.改变SQL中的表的关联顺序
2.改变SQL中的表的关联方式
3.使用并行来执行DML、DDL、以及SELECT语句
4.改变表的访问路径
5.重写SQL
6.其他等
HINT的书写方式如下:
{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */
如:
select /*+ index(emp)*/ count(*) from emp
方法2:使用OUTLINE来改变已有SQL的执行计划
在实际项目中,通常在开发环境下一些SQL执行没有任何问题,而到了生产环境或生产环境的数据量发生较大的变量时,其SQL的执行效率会异常的慢。此时如果更改SQL,则可能需要重新修改源程序以及重新编译程序。如果觉得修改源程序的成本比较大,则可以使用OUTLINE在不改变原应用程序的情况下更改特定SQL的执行计划。
OUTLINE的原理是将调好的SQL的执行计划(一系列的HINT)存贮起来,然后该执行计划所对应的SQL用目前系统那个效率低下的SQL来替代之。从而使得系统每次执行该SQL时,都会使用已存贮的执行计划来执行。因此可以在不改变已有系统SQL的情况下达到改变其执行计划的目的。
OUTLINE方式也是通过存贮HINT的方式来达到执行计划的稳定与改变。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论