- 浏览: 107594 次
- 性别:
- 来自: 沈阳
文章分类
最新评论
-
freerambo:
学习了,刚好解决了我的文件字符编码问题
java文件读写操作指定编码格式 -
ainishigai:
学习了啊
哥们儿你太好了 下次能发表多表插入 ...
Oracle 分页存储过程的实现
如果要分析某条SQL 的性能问题,通常我们要先看 SQL 的执行计划,看看 SQL 的每一步执行是否存在问题。 如果一条 SQL 平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以断定是执行计划出了问题。
看懂执行计划也就成了 SQL 优化的先决条件。 这里的 SQL 优化指的是 SQL 性能问题的定位,定位后就可以解决问题。
一. 查看执行计划的三种方法
1.1 设置 autotrace
序号 |
命令 |
解释 |
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 相似,但不显示语句的执行结果 |
SQL> set autotrace on
SQL> select * from dave;
ID NAME
---------- ----------
8 安庆
1 dave
2 bl
1 bl
2 dave
3 dba
4 sf-express
5 dmm
已选择 8 行。
执行计划
----------------------------------------------------------
Plan hash value: 3458767806
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 64 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DAVE | 8 | 64 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
609 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
8 rows processed
SQL>
1.2 使用 SQL
SQL>EXPLAIN PLAN FOR sql 语句 ;
SQL>SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
示例:
SQL> EXPLAIN PLAN FOR SELECT * FROM DAVE;
已解释。
SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
或者:
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3458767806
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 64 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DAVE | 8 | 64 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
已选择 8 行。
执行计划
----------------------------------------------------------
Plan hash value: 2137789089
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8168 | 16336 | 29 (0)| 00:00:01 |
| 1 | COLLECTION ITERATOR PICKLER FETCH| DISPLAY | 8168 | 16336 | 29 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
统计信息
----------------------------------------------------------
25 recursive calls
12 db block gets
168 consistent gets
0 physical reads
0 redo size
974 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
8 rows processed
SQL>
1.3 使用 Toad,PL/SQL Developer 工具
二. Cardinality (基数) / rows
Cardinality 值表示 CBO 预期从一个行源( row source )返回的记录数,这个行源可能是一个表,一个索引,也可能是一个子查询。 在 Oracle 9i 中的执行计划中, Cardinality 缩写成 Card 。 在 10g 中, Card 值被 rows 替换。
这是 9i 的一个执行计划,我们可以看到关键字 Card :
执行计划
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=402)
1 0 TABLE ACCESS (FULL) OF 'TBILLLOG8' (Cost=2 Card=1 Bytes=402)
Oracle 10g 的执行计划,关键字换成了 rows :
执行计划
----------------------------------------------------------
Plan hash value: 2137789089
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8168 | 16336 | 29 (0)| 00:00:01 |
| 1 | COLLECTION ITERATOR PICKLER FETCH| DISPLAY | 8168 | 16336 | 29 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
Cardinality 的值对于 CBO 做出正确的执行计划来说至关重要。 如果 CBO 获得的 Cardinality 值不够准确(通常是没有做分析或者分析数据过旧造成),在执行计划成本计算上就会出现偏差,从而导致 CBO 错误的制定出执行计划。
在多表关联查询或者 SQL 中有子查询时,每个关联表或子查询的 Cardinality 的值对主查询的影响都非常大,甚至可以说, CBO 就是依赖于各个关联表或者子查询 Cardinality 值计算出最后的执行计划。
对于多表查询, CBO 使用每个关联表返回的行数( Cardinality )决定用什么样的访问方式来做表关联(如 Nested loops Join 或 hash Join )。
对于子查询,它的 Cardinality 将决定子查询是使用索引还是使用全表扫描的方式访问数据。
发表评论
-
D_FILE.PUT&FND_FILE.PUT_LINE
2013-05-07 15:48 966FND_FILE可用于写 FND_FILE.PUT p ... -
Oracle 管道化表函数(Pipelined Table)
2013-01-24 21:51 956在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必 ... -
ORACLE RETURNING 语句的使用方法
2012-12-13 14:33 11041.The RETURNING INTO clause a ... -
OracleMergeinto详细介绍
2012-12-03 00:16 921/*Merge into 详细 ... -
oracle 字符集查看与修改
2012-04-30 09:00 868一、什么是Oracle字符集 Oracle字符集 ... -
Oracle 优化器 CBO与RULE的区别
2012-04-25 13:40 11891、基于规则的优化方式 ... -
Oracle 分页存储过程的实现
2012-03-04 16:19 1684首先创建一个包,包中包含一个游标,这个游标用于分页存储过程返回 ... -
Oracle预定义的21个系统异常类型
2012-03-04 13:47 842命名的系统异常 ... -
ORACLE EXP和IMP参数
2011-12-11 17:14 1126EXP参数说明 关键 ... -
Oracle中trim函数的用法
2011-11-03 15:54 8557trim一般都是用在删除字符串两边的空格。实际上,trim ... -
Sql*plus的使用
2011-10-20 13:37 932Sql*plus是oracle提供的一个工具程序,既可以在or ...
相关推荐
Oracle的Explain Plan是数据库管理员和开发人员用来分析SQL查询执行计划的重要工具。它能提供关于如何执行SQL语句的详细信息,包括哪些操作(如全表扫描、索引访问等)将被使用,以及这些操作的预计成本、时间及资源...
#### 一、Oracle 执行计划的重要性 在Oracle数据库中,为了提高查询效率和系统性能,我们需要对SQL语句进行优化。优化的第一步就是理解SQL语句的执行计划。执行计划是指Oracle数据库优化器为执行特定SQL语句所选择...
Oracle 中的 explain_plan 是一个强大的分析工具,能够帮助用户了解 SQL 语句的执行计划,通过它可以了解 Oracle 是如何连接表、使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称。下面详细讲解 ...
EXPLAIN PLAN 是 Oracle 中一个强大的诊断工具,用于显示 SQL 语句的执行计划。它可以帮助开发者和数据库管理员了解 SQL 语句的执行过程,从而优化 SQL 语句的执行效率。 EXPLAIN PLAN 的使用技巧可以分为以下几个...
在数据库管理领域,Oracle数据库的性能优化是一项至关重要的任务,其中`EXPLAIN PLAN`是数据库管理员和开发人员常用的工具,用于分析SQL查询的执行计划,从而理解查询如何在数据库中运行,找出潜在的性能瓶颈。...
在`SQL*Plus`环境中,可以使用`EXPLAIN PLAN FOR`命令来生成执行计划。例如: ``` SQL> explain plan for select sal from emp where deptno in (select deptno from dept); ``` 然后通过`DBMS_XPLAN.DISPLAY`...
* Explain 语句:使用 Explain 语句可以获取执行计划,例如:Explain Plan Set STATEMENT_ID='testplan' For Select ….. * Autotrace 工具:Autotrace 是 Oracle 提供的一种工具,可以自动跟踪执行计划。 * 其他...
### Oracle执行计划深入解析 #### 引言 在数据库领域,尤其对于大型企业级应用,Oracle数据库因其强大的功能和稳定性而被广泛采用。在Oracle中,执行计划是数据库优化器根据SQL语句特性生成的一系列步骤,用于指导...
3. 使用`EXPLAIN PLAN`或`AUTOTRACE`来分析和比较不同执行计划的性能。 4. 创建并使用物化视图和索引来改善查询性能。 5. 设置适当的优化器相关参数,如`optimizer_features_enable`,以控制特定版本的优化行为。 6....
- **EXPLAIN PLAN**:Oracle提供了一个名为`EXPLAIN PLAN`的工具,用于预览SQL语句的执行计划,而无需实际执行查询。 - **成本基础优化器**:Oracle使用成本基础优化器(CBO)来评估各种执行策略的成本,并选择...
其中,Explain 是通过 Execute Plan 语句生成执行计划的,Autotrace 是通过设置 autotrace 参数生成执行计划的。 在 Oracle 中,生成执行计划需要创建一个 Plan_table 表,用于存储执行计划的信息。该表包括了执行...
了解执行计划有助于评估SQL语句的效率,通常可以通过`EXPLAIN PLAN`或`EXPLAIN PLAN FOR`命令预览执行计划。通过分析执行计划,可以识别可能导致性能瓶颈的操作,如全表扫描在大数据量时的低效,或者未充分利用索引...
### Oracle Explain Plan详解 #### 一、引言 在Oracle数据库中,查询优化器(Oracle Optimizer)的主要职责是为SQL语句确定最高效的执行计划。优化器通过收集关于数据的统计信息,并利用Oracle数据库的各种特性(如...
同样,与EXPLAIN PLAN相比,AUTOTRACE不仅展示了执行计划,还执行了SQL语句,从而能够提供更加准确的统计信息。 #### 准备工作 为了使用AUTOTRACE,需要进行以下准备工作: 1. **创建PLAN_TABLE** - 每个需要运行...
1. **使用EXPLAIN PLAN语句**:通过`EXPLAIN PLAN FOR`语句生成执行计划,随后使用`DBMS_XPLAN.DISPLAY`包来格式化并显示执行计划。这一步并不执行SQL语句,仅生成执行计划。 2. **SQL\*Plus AutoTrace功能**:除了...
在Oracle数据库系统中,"explain plan" 是一个关键的工具,用于分析和理解SQL查询的执行计划,也就是数据检索的路径。它可以帮助数据库管理员和开发人员优化查询性能,确保数据库高效运行。以下是对"explain plan ...
Oracle执行计划是数据库执行SQL语句前确定的操作步骤序列。...它更侧重于提供一个关于如何阅读和理解Oracle SQL执行计划的基础说明。通过实践和学习,用户可以逐渐深化对执行计划的理解,并在此基础上优化SQL语句。
1. 使用 Explain 语句:Explain 语句可以用来获取执行计划,例如:Explain plan set STATEMENT_ID='testplan' for select * from dual; 2. 使用 Autotrace 语句:Autotrace 语句可以用来获取执行计划,例如:set ...