Oracle执行分析详细

php中文网
发布: 2016-06-07 17:35:37
原创
1073人浏览过

我们知道oracle对每条语句产生的执行计划放在share pool里面,第一次要经过硬解析,产生hash值。下次再执行该语句时候比较hash值

我们以下面的一个例子来讲解

这里做个补充:trace的类型一共有以下几种

序号

命令

解释

1

SET AUTOTRACE OFF

此为默认值,即关闭Autotrace

2

SET AUTOTRACE ON EXPLAIN

只显示执行计划

3

SET AUTOTRACE ON STATISTICS

只显示执行的统计信息

4

SET AUTOTRACE ON

包含2,3两项内容

5

SET AUTOTRACE TRACEONLY

与ON相似,但不显示语句的执行结果

我喜欢SET AUTOTRACE TRACEONLY,我们以后的例子都是基于这种方式的

SQL> select * from departments a where a.department_id in (select b.department_id from employees b where b.employee_id=205);


Execution Plan
----------------------------------------------------------
Plan hash value: 2782876085

IT教育培训机构单页模板
IT教育培训机构单页模板

1、IT行业里其实有很多细分领域和工种,领域如云计算、游戏、电商、大数据、金融IT、智能硬件等,工种如开发、运维、测试、产品经理、项目经理、UI设计、数据分析师等,到底学哪个好?根据自身特长 爱好 2、虽然有很多细分领域,但是不是每个领域都适合你,比如像人工智能、VR开发等相比偏难一些的领域,我不觉得适合无计算机专业背景的小白学习,至少不应该做为初始的学习目标,因为这些领域涉及到计算机里各种复

IT教育培训机构单页模板 54
查看详情 IT教育培训机构单页模板

----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name          | Rows  | Bytes | Cost (%CPU)| Time    |
----------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT            |              |    1 |    27 |    2  (0)| 00:00:01 |
|  1 |  NESTED LOOPS                |              |    1 |    27 |    2  (0)| 00:00:01 |
|  2 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES    |    1 |    7 |    1  (0)| 00:00:01 |
|*  3 |    INDEX UNIQUE SCAN        | EMP_EMP_ID_PK |    1 |      |    0  (0)| 00:00:01 |
|  4 |  TABLE ACCESS BY INDEX ROWID| DEPARTMENTS  |    27 |  540 |    1  (0)| 00:00:01 |
|*  5 |    INDEX UNIQUE SCAN        | DEPT_ID_PK    |    1 |      |    0  (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

  3 - access("B"."EMPLOYEE_ID"=205)
  5 - access("A"."DEPARTMENT_ID"="B"."DEPARTMENT_ID")


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
        749  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
 

让我们来一行一行的看:

 

一、表部分

1、Plan hash value:

Plan hash value: 2782876085

这一行是这一条语句的hash值,我们知道Oracle对每条语句产生的执行计划放在share pool里面,第一次要经过硬解析,产生hash值。下次再执行该语句时候比较hash值,如果相同就不要执行硬解析。

 

2、Operation( 操作)

这里的东西就多了,就是把sql进行分解,让我一起看看上的sql,这段sql的第一步是employee_id=25,这里我们employee_id上面建了主键,建主键默认创建唯一索引。这里是用“=”进行限制的,所以走的unique scan方式。其他方式参考Oracle执行计划 讲解(一)内容

3、Name(被操作的对象)

比如上例中的第二行operation(TABLE ACCESS BY INDEX ROWID)这里的TABLE对象为EMPLOYEES

4、Row,有的地方也叫Cardinality(用plsqldev里面解释计划窗口)

这里是数据查询的行数,比如说上个例子第4行, departments 这张表就要扫描27行,然后和子查询(select b.department_id from employees b where b.employee_id=205)的值进行比较。如果使用=(注:大部分时候是不能用=来替换,,这里是特例)就不一样了。

SQL> select * from departments a where a.department_id = (select b.department_id from employees b where b.employee_id=205);


Execution Plan
----------------------------------------------------------
Plan hash value: 3449260133

-----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name          | Rows  | Bytes | Cost (%CPU)| Time    |
-----------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT              |              |    1 |    20 |    2  (0)| 00:00:01 |
|  1 |  TABLE ACCESS BY INDEX ROWID  | DEPARTMENTS  |    1 |    20 |    1  (0)| 00:00:01 |
|*  2 |  INDEX UNIQUE SCAN          | DEPT_ID_PK    |    1 |      |    0  (0)| 00:00:01 |
|  3 |    TABLE ACCESS BY INDEX ROWID| EMPLOYEES    |    1 |    7 |    1  (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN        | EMP_EMP_ID_PK |    1 |      |    0  (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号