一、如何查看执行计划
PL/SQL中查看执行计划
方法1:选中SQL语句按F5
方法2:explain plan for +目标sql;
select * from table(dbms_xplan.display);
SQLCMD中打开执行计划:
set autotrace traceonly;---只显示SQL所对应的执行计划和资源消耗情况
set autotrace on/off; ---不仅显示SQL所对应的执行计划和资源消耗情况,还显示SQL执行的结果;off---关闭开关。
例如:
SQL> explain plan for select empno,ename,dname from emp,dept where emp.deptno=dept.deptno;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 615168685
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 770 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN | | 14 | 770 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP | 14 | 462 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
Note
-----
- dynamic sampling used for this statement (level=2)
19 rows selected.
SQL>
二、执行计划谓词说明
执行计划谓词说明:
(1)字段解释
ID: 一个序号,但不是执行的先后顺序。执行的先后根据缩进来判断。 Operation: 当前操作的内容。 Rows: 当前操作的Cardinality,Oracle估计当前操作的返回结果集。 Cost(CPU):Oracle 计算出来的一个数值(代价),用于说明SQL执行的代价。 Time:Oracle 估计当前操作的时间。 (2)如何看懂执行计划 一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。
(3)谓词说明
Access: 表示这个谓词条件的值将会影响数据的访问路劲(表还是索引)。
Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。
(4)统计信息说明 db block gets : 从buffer cache中读取的block的数量 consistent gets: 从buffer cache中读取的undo数据的block的数量 physical reads: 从磁盘读取的block的数量 redo size: DML生成的redo的大小 sorts (memory) :在内存执行的排序量 sorts (disk) :在磁盘上执行的排序量 Physical Reads通常是我们最关心的,如果这个值很高,说明要从磁盘请求大量的数据到Buffer Cache里,通常意味着系统里存在大量全表扫描的SQL语句,这会影响到数据库的性能,因此尽量避免语句做全表扫描,对于全表扫描的SQL语句,建议增 加相关的索引,优化SQL语句来解决。
逻辑读指的是Oracle从内存读到的数据块数量。一般来说是'consistent gets' + 'db block gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'physical reads'
|