易网时代-编程资源站
Welcome
微信登录
首页
/
数据库
/
MySQL
/
Oracle执行计划 讲解(一)
看懂Oracle执行计划是优化的第一步,让我们从下面的例子开始吧。
下面为补充内容
1、创建测试表
SQL>
create
table
t
as
select
1 id,object_name
from
dba_objects;
Table
created
SQL>
update
t
set
id=99
where
rownum=1;
1 row updated
SQL>
commit
;
Commit
complete
SQL>
create
index
t_ind
on
t(id);
Index
created
oracle优化器:RBO和CBO两种, 从oracle10g开始优化器已经抛弃了RBO,下面的列子说明CBO大概是怎样的
SQL>
select
/*+dynamic_sampling(t 0) */*
from
t
where
id=1;
50819
rows
selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1376202287
-------------------------------------------------------------------------------------
| Id | Operation |
Name
|
Rows
| Bytes | Cost (%CPU)|
Time
|
-------------------------------------------------------------------------------------
| 0 |
SELECT
STATEMENT | | 195 | 15405 | 51 (0)| 00:00:01 |
| 1 |
TABLE
ACCESS
BY
INDEX
ROWID| T | 195 | 15405 | 51 (0)| 00:00:01 |
|* 2 |
INDEX
RANGE SCAN | T_IND | 78 | | 50 (0)| 00:00:01 |
-------------------------------------------------------------------------------------
Predicate Information (identified
by
operation id):
---------------------------------------------------
2 - access(
"ID"
=1)
现象t表还没有被分析,提示/*+dynamic_sampling(t 0) */*的目的是让CBO无法通过动态采样获取表中的实际数据情况,此时CBO只能根据T表中非常有限的信息(比如表中的extents数量,数据块的数量)来猜测表中的数据。从结果中可以看到CBO猜出表中id=1的有195条,这个数值对于表的总数来说,是一个非常小的值,所以CBO选择了索引而不是全表扫描。
而实际情况如下所示:
SQL>
select
*
from
t
where
id=1
2 ;
50819
rows
selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation |
Name
|
Rows
| Bytes | Cost (%CPU)|
Time
|
--------------------------------------------------------------------------
| 0 |
SELECT
STATEMENT | | 49454 | 3815K| 67 (2)| 00:00:01 |
|* 1 |
TABLE
ACCESS
FULL
| T | 49454 | 3815K| 67 (2)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified
by
operation id):
---------------------------------------------------
1 - filter(
"ID"
=1)
通过动态取样,CBO估算出行数为49454,非常接近于真实50820数目。选择了全表扫描。
我们来收集一下统计信息
SQL>
exec
dbms_stats.gather_table_stats(
user
,
"t"
,
cascade
=>
true
);
SQL>
select
*
from
t
where
id=1;
50819
rows
selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation |
Name
|
Rows
| Bytes | Cost (%CPU)|
Time
|
--------------------------------------------------------------------------
| 0 |
SELECT
STATEMENT | | 50815 | 1339K| 67 (2)| 00:00:01 |
|* 1 |
TABLE
ACCESS
FULL
| T | 50815 | 1339K| 67 (2)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified
by
operation id):
---------------------------------------------------
1 - filter(
"ID"
=1)
现在扫描过的行数为50815。
如果我们更新了所有的id为99看看。
SQL>
update
t
set
id=99;
50820
rows
updated
SQL>
select
*
from
t
where
id=99;
Execution Plan
----------------------------------------------------------
Plan hash value: 1376202287
-------------------------------------------------------------------------------------
| Id | Operation |
Name
|
Rows
| Bytes | Cost (%CPU)|
Time
|
-------------------------------------------------------------------------------------
| 0 |
SELECT
STATEMENT | | 1 | 27 | 2 (0)| 00:00:01 |
| 1 |
TABLE
ACCESS
BY
INDEX
ROWID| T | 1 | 27 | 2 (0)| 00:00:01 |
|* 2 |
INDEX
RANGE SCAN | T_IND | 1 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------
Predicate Information (identified
by
operation id):
---------------------------------------------------
2 - access(
"ID"
=99)
因为没有对表进行分析,所以表中的分析数据还是之前的信息,CBO并不知道。我们可以看出Rows值为1,也就是说CBO人为表T中的ID=99的值只有1条,所有选择仍然是索引。
我们收集一把统计信息。
SQL>
exec
dbms_stats.gather_table_stats(
user
,
"t"
,
cascade
=>
true
);
PL/SQL
procedure
successfully completed
SQL>
select
*
from
t
where
id=99;
50820
rows
selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation |
Name
|
Rows
| Bytes | Cost (%CPU)|
Time
|
--------------------------------------------------------------------------
| 0 |
SELECT
STATEMENT | | 50815 | 1339K| 67 (2)| 00:00:01 |
|* 1 |
TABLE
ACCESS
FULL
| T | 50815 | 1339K| 67 (2)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified
by
operation id):
---------------------------------------------------
1 - filter(
"ID"
=99)
上面为补充内容,下面正式开始
1
2
3
4
5
6
7
下一页
Oracle 文件损坏及恢复的过程Oracle执行计划 讲解(二)相关资讯 Oracle基础教程
Oracle块编程返回结果集详解 (11/10/2013 10:45:58)
Oracle基础教程之设置系统全局区 (08/22/2013 14:24:00)
Oracle基础教程知识点总结 (06/18/2013 07:43:32)
Oracle基础教程之tkprof程序详解 (10/22/2013 11:49:50)
Oracle基础教程之sqlplus汉字乱码 (07/18/2013 16:30:00)
Oracle 管理之 Linux 网络基础 (02/16/2013 18:37:35)
本文评论 查看全部评论 (0)
表情: 姓名:
匿名
字数
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图