- 浏览: 97435 次
- 性别:
- 来自: 沈阳
文章分类
最新评论
-
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 868FND_FILE可用于写 FND_FILE.PUT p ... -
Oracle 管道化表函数(Pipelined Table)
2013-01-24 21:51 852在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必 ... -
ORACLE RETURNING 语句的使用方法
2012-12-13 14:33 10011.The RETURNING INTO clause a ... -
OracleMergeinto详细介绍
2012-12-03 00:16 817/*Merge into 详细 ... -
oracle 字符集查看与修改
2012-04-30 09:00 774一、什么是Oracle字符集 Oracle字符集 ... -
Oracle 优化器 CBO与RULE的区别
2012-04-25 13:40 10101、基于规则的优化方式 ... -
Oracle 分页存储过程的实现
2012-03-04 16:19 1445首先创建一个包,包中包含一个游标,这个游标用于分页存储过程返回 ... -
Oracle预定义的21个系统异常类型
2012-03-04 13:47 747命名的系统异常 ... -
ORACLE EXP和IMP参数
2011-12-11 17:14 1032EXP参数说明 关键 ... -
Oracle中trim函数的用法
2011-11-03 15:54 8444trim一般都是用在删除字符串两边的空格。实际上,trim ... -
Sql*plus的使用
2011-10-20 13:37 840Sql*plus是oracle提供的一个工具程序,既可以在or ...
相关推荐
oracle执行计划,oracle explain plan,在ORACLE数据库中,需要对SQL语句进行优化的话需要知道其执行计划,从而针对性的进行调整.ORACLE的执行计划的获得有几种方法,下面就来总结下
详细讲解在Oracle中如何使用explain_plan,值得参考和收藏学习。
NULL 博文链接:https://babydeed.iteye.com/blog/1567772
Oracle中EXPLAIN PLAN的使用技巧
Oracle 执行计划 explain sql execution plan
explain plan非常令人难解,初学者看看很好,有助于搞清楚最基本的概念
NULL 博文链接:https://qidaoxp.iteye.com/blog/758552
详细介绍了oracle解释计划的原理,对理解oracle解释计划非常有用。
1. 预估执行计划 – Explain PlanExplain plan以SQL语句作为输入,得到这条SQL语句的执行计划,并将执行计划输出存储到计划表中。 首先,在你要执行的SQL语句前加explain plan for,此时将生成的执行计划存储到计划...
一、什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。 二、如何查看执行计划 1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。 很多人以为PL/SQL的执行计划只能...
第一种:不设置输出格式参数,即用默认的 SQL> create or replace procedure sql_explain(v_sql varchar2) ... 7 execute immediate 'explain plan for '||v_sql; 8 open explain_cursor fo
CBO尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,计算使用不同 的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于确定执行计划。 4:如何定位重要(消耗资源多)...
explain plan for select ename,job,sal,comm from empcon where (sal-700);--已解释 desc plan_table; col id for 999 col operation for a16 col option for a16 col object_name for a16 Select id,operation,...
2:不借助第三方工具,怎样查看sql的执行计划 set autot on explain plan set statement_id = &item_id for &sql; select * from table(dbms_xplan.display); 或者: SQL>EXPLAIN PLAN FOR SELECT * FROM ...
<7> 运行命令 "explain plan for SQL" 或按菜单项 "Explain Plan",能快速地显示 SQL 的执行计划; "Export" 按钮或菜单项,能直接将 SELECT 语句结果转化为 INSERT 语句,方便于数据移植、备份等 <8> 运行命令...
query processing,Explain plan,autotrace
10.2.1 通过V$SQL_PLAN获得执行计划 479 10.2.2 EXPLAIN PLAN FOR与DBMS_XPLAN 483 10.2.3 通过AWR获取SQL执行计划 487 10.3 捕获问题SQL解决过度CPU消耗问题 488 10.3.1 使用vmstat检查系统当前情况 488 ...
1.如何分析SQL语句 2.选用适合的ORACLE优化器 3.用EXPLAIN PLAN 分析SQL语句 4.使用TKPROF 工具来查询SQL性能状态 5.表分区的应用
SQL> explain plan for alter index idx_policy_id2 rebuild online; Explained SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -----------------------------------------------------...
(2)“Explain Plan” 按钮能快速地显示语句的执行计划; (3)“Export” 按钮能将 SELECT 语句块直接导出为 INSERT 语句,方便于数据移植、备份等; (4)支持列块操作; (5)加上/去掉注释标记、加上/去掉...