重庆思庄Oracle、Redhat认证学习论坛

标题: 基于ORACLE的SQL优化---执行计划(2、如何查看执行计划) [打印本页]

作者: miss_puff    时间: 2018-3-2 11:10
标题: 基于ORACLE的SQL优化---执行计划(2、如何查看执行计划)
一、如何查看执行计划
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'



作者: miss_puff    时间: 2018-3-2 11:30
查看执行计划还可以通过开启10046事件来查看。




欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2