- 浏览: 766791 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
HarryMa:
v
SpringMVC异常报406 (Not Acceptable)的解决办法 -
HarryMa:
[i][/i]。。
SpringMVC异常报406 (Not Acceptable)的解决办法 -
lingyun6100:
我也遇到同样问题,我的错误原因是错引用了JSONObject。 ...
SpringMVC异常报406 (Not Acceptable)的解决办法 -
cbn_1992:
972974124 写道换了json的jar包还是不好用,我把 ...
SpringMVC异常报406 (Not Acceptable)的解决办法 -
go_myself:
...
解决异常:java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
现在我们讲讲oracle执行计划里面每个参数的含义
我们以下面的一个例子来讲解
这里做个补充:trace的类型一共有以下几种
我喜欢SET AUTOTRACE TRACEONLY,我们以后的例子都是基于这种方式的
view plaincopy
让我们来一行一行的看:
一、表部分
1、Plan hash value:
[sql] view plaincopy
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] view plaincopy
5、Byte
扫描的数据的字节数
6、Cost
这里上次讲过了,这里简单说下吧。
cost没有单位,是一个相对值,是sql文以cbo方式解析执行时,供oracle用来评估cbo成本,选择执行计划用的。
公式:Cost=(Single block I/O cost+ Multiblock I/O cost+ CPU cost)/sreadtim
没有明确的含义,不过对比时就非常有用了。
7、Time
每段执行的时间
二、Predicate Information
这里列出的是过滤条件,一共有两种:
1、索引(access)
如上例中的access("B"."EMPLOYEE_ID"=205),这里使用索引作为过滤条件
2、非索引(filter),看下面这里例子
[sql] view plaincopy
这里的过滤条件是FIRST_NAME,但是FIRST_NAME没有建立索引,这个时候使用filter,做标记。
三、Statistics(统计信息)
这里是重点要说的,如果看累了,可以去喝口水。O(∩_∩)O~
AUTOTRACE Statistics列解释
1、recursive calls(重点讲解)
官网对recursive calls 的解释如下:
Recursive Calls: Number of recursive calls generated at both the user and system level.
Oracle Database maintains tables used for internal processing. When it needs to change these tables, Oracle Database generates an internal SQL statement, which in turn generates a recursive call.In short, recursive calls are basically SQL performed on behalf of your SQL. So, if you had to parse the query, for example, you might have had to run some other queries to get data dictionary information. These would be recursive calls. Space management, security checks, calling PL/SQL from SQL—all incur recursive SQL calls。
IBM上面也有一篇讲解,有兴趣可以看看
http://publib.boulder.ibm.com/tividd/td/ITMD/SC23-4724-00/en_US/HTML/oraclepac510rg59.htm
总结一下:
当执行一条SQL语句时,产生的对其他SQL语句的调用,这些额外的语句称之为''recursive calls''或''recursive SQL statements''.
在IBM 的那片文档里讲了触发Recursive Call的6种情况:
如:
(1)我们做一条insert 时,没有足够的空间来保存row记录,Oracle 通过Recursive Call 来动态的分配空间。
(2)执行DDL语句时,ORACLE总是隐含的发出一些recursive SQL语句,来修改数据字典信息,以便成功的执行该DDL语句。
(3)当Shared Pool过小,data dictionary cache 也会相应的过小,没有足够的空间存储ORACLE的系统数据字典信息时,会发生Recursive calls,这些Recursive calls会将数据字典信息从硬盘读入内存中。
(4)存储过程、触发器内如果有SQL调用的话,也会产生recursive SQL。
在这些情况中,主要是对数据字典的查询,通常发生在第一次执行时,第二次执行一般可显著降低。递归需要消耗大量的资源,如果操作复杂,很容易出现问题!
现在让我们举例说明:
[sql] view plaincopy
让我们再执行一遍
[sql] view plaincopy
在第一次查询employees时,产生了1次recursive Call,第二次查询的时候,因为数据字典的信息信息已经放在cache里,所以第二次的recursive call 为0. 如果第二次也没有完全cache,那么也是会产生recursive call,但次数比第一次少。
其他的从字面上面就可以看出来了,不需要多解释了吧。
原文URL:http://blog.csdn.net/rulev5/article/details/6988180
我们以下面的一个例子来讲解
这里做个补充: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,我们以后的例子都是基于这种方式的
view plaincopy
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 ---------------------------------------------------------------------------------------------- | 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:
[sql] view plaincopy
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] view plaincopy
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): --------------------------------------------------- 2 - access("A"."DEPARTMENT_ID"= (SELECT /*+ */ "B"."DEPARTMENT_ID" FROM "EMPLOYEES" "B" WHERE "B"."EMPLOYEE_ID"=205)) 4 - access("B"."EMPLOYEE_ID"=205) Statistics ---------------------------------------------------------- 0 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
5、Byte
扫描的数据的字节数
6、Cost
这里上次讲过了,这里简单说下吧。
cost没有单位,是一个相对值,是sql文以cbo方式解析执行时,供oracle用来评估cbo成本,选择执行计划用的。
公式:Cost=(Single block I/O cost+ Multiblock I/O cost+ CPU cost)/sreadtim
没有明确的含义,不过对比时就非常有用了。
7、Time
每段执行的时间
二、Predicate Information
这里列出的是过滤条件,一共有两种:
1、索引(access)
如上例中的access("B"."EMPLOYEE_ID"=205),这里使用索引作为过滤条件
2、非索引(filter),看下面这里例子
[sql] view plaincopy
SQL> select employee_id from employees c where c.first_name = 'Steven' 2 3 ; Execution Plan ---------------------------------------------------------- Plan hash value: 1445457117 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 11 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| EMPLOYEES | 1 | 11 | 3 (0)| 00:00:01 | ------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("C"."FIRST_NAME"='Steven') Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 8 consistent gets 0 physical reads 0 redo size 574 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) 2 rows processed
这里的过滤条件是FIRST_NAME,但是FIRST_NAME没有建立索引,这个时候使用filter,做标记。
三、Statistics(统计信息)
这里是重点要说的,如果看累了,可以去喝口水。O(∩_∩)O~
AUTOTRACE Statistics列解释
序号 | 列名 | 解释 |
1 | recursive calls | 递归调查 |
2 | db block gets | 从buffer cache中读取的block的数量 |
3 | consistent gets | 从buffer cache中读取的undo数据的block的数量 |
4 | physical reads | 从磁盘读取的block的数量 |
5 | redo size | DML生成的redo的大小 |
6 | sorts (memory) | 在内存执行的排序量 |
7 | sorts (disk) | 在磁盘上执行的排序量 |
1、recursive calls(重点讲解)
官网对recursive calls 的解释如下:
Recursive Calls: Number of recursive calls generated at both the user and system level.
Oracle Database maintains tables used for internal processing. When it needs to change these tables, Oracle Database generates an internal SQL statement, which in turn generates a recursive call.In short, recursive calls are basically SQL performed on behalf of your SQL. So, if you had to parse the query, for example, you might have had to run some other queries to get data dictionary information. These would be recursive calls. Space management, security checks, calling PL/SQL from SQL—all incur recursive SQL calls。
IBM上面也有一篇讲解,有兴趣可以看看
http://publib.boulder.ibm.com/tividd/td/ITMD/SC23-4724-00/en_US/HTML/oraclepac510rg59.htm
总结一下:
当执行一条SQL语句时,产生的对其他SQL语句的调用,这些额外的语句称之为''recursive calls''或''recursive SQL statements''.
在IBM 的那片文档里讲了触发Recursive Call的6种情况:
如:
(1)我们做一条insert 时,没有足够的空间来保存row记录,Oracle 通过Recursive Call 来动态的分配空间。
(2)执行DDL语句时,ORACLE总是隐含的发出一些recursive SQL语句,来修改数据字典信息,以便成功的执行该DDL语句。
(3)当Shared Pool过小,data dictionary cache 也会相应的过小,没有足够的空间存储ORACLE的系统数据字典信息时,会发生Recursive calls,这些Recursive calls会将数据字典信息从硬盘读入内存中。
(4)存储过程、触发器内如果有SQL调用的话,也会产生recursive SQL。
在这些情况中,主要是对数据字典的查询,通常发生在第一次执行时,第二次执行一般可显著降低。递归需要消耗大量的资源,如果操作复杂,很容易出现问题!
现在让我们举例说明:
[sql] view plaincopy
SQL> select * from employees; 107 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 1445457117 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 107 | 7276 | 3 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7276 | 3 (0)| 00:00:01 | ------------------------------------------------------------------------------- Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 15 consistent gets 0 physical reads 0 redo size 9997 bytes sent via SQL*Net to client 569 bytes received via SQL*Net from client 9 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 107 rows processed
让我们再执行一遍
[sql] view plaincopy
SQL> select * from employees; 107 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 1445457117 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 107 | 7276 | 3 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7276 | 3 (0)| 00:00:01 | ------------------------------------------------------------------------------- Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 15 consistent gets 0 physical reads 0 redo size 9997 bytes sent via SQL*Net to client 569 bytes received via SQL*Net from client 9 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 107 rows processed
在第一次查询employees时,产生了1次recursive Call,第二次查询的时候,因为数据字典的信息信息已经放在cache里,所以第二次的recursive call 为0. 如果第二次也没有完全cache,那么也是会产生recursive call,但次数比第一次少。
其他的从字面上面就可以看出来了,不需要多解释了吧。
原文URL:http://blog.csdn.net/rulev5/article/details/6988180
发表评论
-
ubuntu系统设置定时备份mysql
2013-12-13 16:01 5356第一步:创建mysql的备份执行脚本 1.新建备份脚本文件,在 ... -
mongodb的安装以及加入服务启动项(windows)
2013-12-12 13:32 170871、下载mongodb的windows版本,注意下载你操作系统 ... -
(转)保障MySQL安全的14个最佳方法
2013-11-23 13:35 1396MySQL数据库一贯以高性 ... -
redhat5下安装MySQL-5.6,默认密码无法进入的解决办法
2013-08-10 21:00 4970redhat5下安装MySQL-5.6,默认装完没有设 ... -
Oracle TNS:监听程序当前无法识别连接描述符中请求的服务
2012-11-12 15:14 11005当数据库服务一切启动正常,但连接数据库时报如下错误: ... -
oracle监听无法启动
2012-10-27 18:05 1846我这描述的无法启动Oracle监听是安装完成时可以正 ... -
Oracle执行计划 讲解(一)
2012-07-31 18:26 14586看懂Oracle执行计划是优 ... -
Oracle 数据库导入,导出命令
2012-07-17 15:17 1381Oracle 数据导入导出imp/exp就相当于oracle数 ... -
提高游标批量读取的效率
2012-07-12 16:00 1692通过bulk collect减少loop处 ... -
提高游标批量读取的效率
2012-07-12 15:48 2通过bulk collect减少loop处 ... -
oracle dblink创建及其使用和使用中问题解决
2012-07-04 15:34 203921.创建dblink的语法: CREATE [PUBLIC] ... -
Oracle 用户的相关操作
2012-06-18 16:49 1236创建用户jade: create user jade id ... -
表空间的相关操作
2012-06-18 11:07 1306查看oracle所有的表空间的使用情况: 方法一、 selec ... -
oracle 表分区
2012-06-13 15:43 1007从以下几个方面来整理关于分区表的概念及操作: 1.表 ... -
Oracle 时间的应用小技巧
2012-06-13 09:27 32241、取得当前的日期 select sysdate from d ... -
Oracle中对时间的小技巧
2012-06-13 09:14 21、取得当前的日期 select sysdate from d ... -
字符函数
2012-04-23 21:39 1061一、字符函数——返回字符值 这些函数全都接收的是字符族 ... -
pl/sql 执行计划
2012-04-11 17:41 1372一段SQL代码写好以后, ... -
SQL优化规则
2012-04-06 13:24 10841、使用索引来更快地遍历表。 缺省情况下建立的索引是非 ... -
提高SQL查询性能
2012-03-29 22:53 1088适当遵循一些原则 ...
相关推荐
- `Oracle数据库(执行计划)第6讲.ppt`可能包含了讲解执行计划的第六部分内容,包括更深入的案例分析和技巧分享。 - `执行计划.txt`可能包含了一次或多次执行计划的输出,帮助我们理解执行过程和优化方向。 - `...
### Oracle 11g 执行计划管理详解 #### 引言 随着数据库系统的不断发展与完善,Oracle 11g 在数据库优化方面引入了一系列创新性功能。其中之一便是执行计划管理(SQL Plan Management)。这一特性旨在帮助数据库...
【Oracle执行计划和SQL调优】是数据库管理中至关重要的环节,主要涉及到如何高效地运行SQL语句,提高数据库性能。下面将详细讲解执行计划的相关概念以及SQL调优的策略。 1. **Rowid的概念**:Rowid是Oracle数据库中...
在讲解执行计划时,创建了一个名为PLAN_TABLE的表,用于存储通过EXPLAIN PLAN获取的信息。这个表包含了各种执行计划相关的列,如操作类型、成本、行数预测等。 7. **Autotrace输出**: 在示例中,设置了AUTOTRACE...
本文档介绍了在Oracle中固定执行计划的三种方法,分别是outline、SQLProfile和SPM(SQL Plan Management),并且着重讲解了SQLProfile和SPM的使用。 1. Outline方法 Outline是一种较老的技术,在Oracle的9i版本中就...
标题与描述均指向了“Oracle数据库详细讲解”,这意味着文章将深度探讨Oracle数据库的相关知识,包括其功能、操作、管理及应用技巧。Oracle数据库是全球领先的数据库管理系统之一,由Oracle公司开发,广泛应用于企业...
本资料集旨在提供全面的Oracle数据库讲解和SQL实践指导。 首先,我们来看"16.1.JDBC基础.pdf"和"16.2.JDBC高级.pdf"。JDBC(Java Database Connectivity)是Java语言中用来连接数据库的标准接口,由Oracle公司开发...
下面我们将详细讲解 oracle 中的定时执行存储过程。 一、创建简单的表 在 oracle 中,创建一个简单的表可以使用以下 SQL 语句: ```sql create table testdate( name varchar2(20), createdate date ); ``` 这...
本篇将详细讲解如何利用shell脚本来批量执行Oracle数据库脚本,以及涉及的相关知识点。 首先,我们来看标题中的"linux下批量执行oracle脚本的shell脚本",这指的是在Linux操作系统中,通过编写shell脚本来自动化...
而SQL优化则是通过分析执行计划,选择最佳的访问路径和操作顺序来提高查询速度。 Oracle函数是SQL查询中不可或缺的部分。"oracle函数大全"可能包含了如数学函数、字符串函数、日期时间函数、转换函数等。例如,数学...
"Oracle很详细的讲解.pdf"这个文档很可能涵盖了Oracle的基础知识,包括数据库架构、SQL语言、数据管理、安全性、性能优化等多个方面。 首先,让我们来看看Oracle数据库的核心概念。Oracle采用的是关系模型,其基本...
Oracle 触发器实例讲解 Oracle 触发器是一种特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。它主要有以下几个功能: 1. 允许/限制对表的修改:触发器可以控制对表的修改操作,...
Oracle进程则执行各种任务,如数据I/O、事务处理和安全管理。 Oracle数据库的"物理结构"由数据文件、重做日志文件和控制文件组成,这些都是操作系统的文件。而"逻辑结构"则包括表空间、段、范围、数据块和模式对象...
### 结合实例深入讲解Oracle中的直方图Histogram #### 一、直方图的基本概念 直方图是一种统计图表,在多种领域中都有广泛的应用,它并非Oracle数据库所独有的功能。直方图通常用来描绘一组数据的分布情况,通过一...
Oracle数据库系统是全球广泛使用的大型关系数据库管理系统,它在企业级数据存储、管理和处理方面具有卓越性能。Oracle的客户端/服务器架构...《Oracle语法实例讲解》这样的资源可以帮助你进一步提升Oracle技能。
触发器章节则介绍触发器的创建和应用,它是特殊类型的存储过程,可以在数据修改事件发生时自动执行。 事务管理章节介绍事务的概念,保证数据库操作的原子性、一致性、隔离性和持久性(ACID属性)。用户管理章节涉及...
本文将详细讲解如何在Oracle环境中利用批处理文件同时执行多个.sql文件,以及相关的工具和源码应用。 首先,Oracle提供了一种名为SQL*Plus的命令行工具,它是与Oracle数据库交互的主要接口之一,非常适合进行批处理...
Oracle触发器是数据库对象,用于在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行一段PL/SQL代码。触发器可以帮助实现业务规则、数据验证和审计功能。以下是一些实例,详细解释了如何创建和使用Oracle...
通过分析SQL执行计划、调整索引和内存参数,可以有效提升数据库性能。 七、安全性 Oracle 10g提供了丰富的安全特性,包括用户权限管理、角色、审计和透明数据加密。理解如何设置合适的权限、实施审计策略以及保护...
#### 二、RAC Oracle 架构关键组件 - **节点**:每个节点都是一个独立的数据库实例,它们共享相同的物理存储资源。 - **网络层**:包括私有网络(用于节点间通信)和公共网络(用于客户端访问)。 - **存储层**:...