oracle优化4(sql语句性能诊断,sql执行计划)
什么是优化
优化是选择最有效的执行计划来执行SQL语句的过程,这是在处理任何数据的语句(SELECT,INSERT,UPDATE或DELETE)中的一个重要步骤。对Oracle来说,执行这样的语句有许多不同的方法,譬如说,将随着以什么顺序访问哪些表或索引的不同而不同。所使用的执行计划可以决定语句能执行得有多快。Oracle中称之为优化器(Optimizer)的组件用来选择这种它认为最有效的执行计划。
什么是执行计划
在运行一条DML语句时,oracle可能需要执行多个步骤。例如,从数据库物理文件中获取数据行,或将数据整理为提交语句的用户所需的形式。Oracle运行一条语句的所有步骤被告称为语句的执行计划(execution plan)。执行计划中包括语句所需数据所在数据表的访问方式,以及数据表的访问顺序(即关联顺序)。
如果查看执行计划
EXPLAIN PLAN
SQL*PLUS autotrace feature
EXPLAIN PLAN
1、解释执行计划
执行文件:rdbms/admin/utlxplan.sql
Explain plan for select语句
2、查看执行计划的信息
1)、查询plan_table
select * from plan_table;
2)、使用脚本 utlxpls.sql
3)、使用包:dbms_xplan
select * from table(dbms_xplan.display);
说明:产生的计划需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 如果两个操作处于同一层中,带有最小操作号的将被首先执行
如:
SELECT * FROM dept, emp WHERE emp.deptno = dept.deptno
14 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 NESTED LOOPS
2 1 TABLE ACCESS (FULL) OF 'EMP'
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
通过以上分析,可以得出实际的执行步骤是:
1. TABLE ACCESS (FULL) OF 'EMP'
2. INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
3. TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
4. NESTED LOOPS (JOINING 1 AND 3)
SQL*PLUS autotrace feature
使用autotrace
语法:set autotrace { off | on | traceonly | explain | statistics }
SET AUTOTRACE OFF 此为默认值,即关闭Autotrace
SET AUTOTRACE ON EXPLAIN 只显示执行计划
SET AUTOTRACE ON STATISTICS 只显示执行的统计信息
SET AUTOTRACE ON 包含2,3两项内容
SET AUTOTRACE TRACEONLY 与ON相似,但不显示语句的执行结果。
ID_PLUS_EXP:每一步骤的行号
PARENT_ID_PLUS_EXP:每一步的Parent的级别号
PLAN_PLUS_EXP:实际的每步
OBJECT_NODE_PLUS_EXP: Dblink或并行查询时才会用到
AUTOTRACE Statistics常用列解释
db block gets :从buffer cache中读取的block的数量
consistent gets :从buffer cache中读取的undo数据的block的数量
physical reads :从磁盘读取的block的数量
redo size DML:生成的redo的大小
sorts (memory) :在内存执行的排序量
sorts (disk): 在磁盘上执行的排序量