Oracle执行计划讲解51页文档资料Word格式文档下载.docx
《Oracle执行计划讲解51页文档资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Oracle执行计划讲解51页文档资料Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
created
update
set
id=99
where
rownum=1;
row
updated
commit;
Commit
complete
index
t_ind
on
t(id);
Index
oracle优化器:
RBO和CBO两种,从oracle10g开始优化器已经抛弃了RBO,下面的列子说明CBO大概是怎样的
/*+dynamic_sampling(t
0)
*/*
id=1;
50819
rows
selected.
Execution
Plan
hash
value:
1376202287
|
Id
Operation
Name
Rows
Bytes
Cost
(%CPU)|
Time
0
SELECT
STATEMENT
195
15405
51
(0)|
00:
01
TABLE
ACCESS
BY
INDEX
ROWID|
T
|*
2
RANGE
SCAN
T_IND
78
50
Predicate
Information
(identified
by
operation
id):
-
access("
ID"
=1)
现象t表还没有被分析,提示/*+dynamic_sampling(t0)*/*的目的是让CBO无法通过动态采样获取表中的实际数据情况,此时CBO只能根据T表中非常有限的信息(比如表中的extents数量,数据块的数量)来猜测表中的数据。
从结果中可以看到CBO猜出表中id=1的有195条,这个数值对于表的总数来说,是一个非常小的值,所以CBO选择了索引而不是全表扫描。
而实际情况如下所示:
*
id=1
;
1601196873
49454
3815K|
67
(2)|
FULL|
filter("
通过动态取样,CBO估算出行数为49454,非常接近于真实50820数目。
选择了全表扫描。
我们来收集一下统计信息
exec
dbms_stats.gather_table_stats(user,'
t'
cascade
=>
true);
50815
1339K|
现在扫描过的行数为50815。
如果我们更新了所有的id为99看看。
id=99;
50820
27
=99)
因为没有对表进行分析,所以表中的分析数据还是之前的信息,CBO并不知道。
我们可以看出Rows值为1,也就是说CBO人为表T中的ID=99的值只有1条,所有选择仍然是索引。
我们收集一把统计信息。
PL/SQL
procedure
successfully
completed
上面为补充内容,下面正式开始
1、sql的执行计划
创建测试表
t1(id
int,name
varchar2(1000));
t2(id
ind_t1
t1(id);
ind_t2
t2(id);
ind_t2_name
t2(name);
insert
into
t1
a.OBJECT_ID,a.OBJECT_NAME
all_objects
a;
50206
inserted
t2
a
rownum<
=20;
20
t1'
t2'
2、产生执行计划
t1,t2
t1.id=
t2.id;
828990364
780
43
T1
28
NESTED
LOOPS
3
FULL
T2
220
4
IND_T1
id)