设为首页 加入收藏

TOP

Oracle索引聚簇因子的含义及重要性(二)
2017-02-28 08:15:49 】 浏览:708
Tags:Oracle 索引 因子 含义 重要性
r_table_stats(ownname=>'ZX',tabname=>'T1',method_opt=>'for all columns size auto',cascade=>true,estimate_percent=>100);
?
PL/SQL procedure successfully completed.
?
linuxidc@MYDB>select index_name,clustering_factor from dba_indexes where index_name='IDX_T1';
?
INDEX_NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CLUSTERING_FACTOR
------------------------------------------------------------------------------------------ -----------------
IDX_T1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 20


在Oracle数据库中,能够降低目标索引的聚簇因子的唯一方法就是对表中的数据按照目标索引的索引键值排序后重新存储。需要注意的是,这种按某一个目标索引的索引键值排序后重新存储表中数据的方法确实可以降低该目标索引聚簇因子的值,但可能会同时增加该表上存在的其他索引值的聚簇因子的值。


将表T1的数据原封不动的照搬到表T2中,只不过表T2的数据在存储时已经按id列排好序了


linuxidc@MYDB>create table t2 as select * from t1 order by id;
?
Table created.
?
linuxidc@MYDB>create index idx_t2 on t2(id);
?
Index created.
?
linuxidc@MYDB>select id,dbms_rowid.rowid_relative_fno(rowid)||'_'||dbms_rowid.rowid_block_number(rowid) location from t2 order by location,id;
?
? ? ? ? ID LOCATION
---------- ----------
? ? ? ? 1 4_171
? ? ? ? 2 4_171
? ? ? ? 3 4_171
? ? ? ? 4 4_171
? ? ? ? 5 4_171
? ? ? ? 6 4_172
? ? ? ? 7 4_172
? ? ? ? 8 4_172
? ? ? ? 9 4_172
? ? ? ? 10 4_172
? ? ? ? 11 4_173
? ? ? ? 12 4_173
? ? ? ? 13 4_173
? ? ? ? 14 4_173
? ? ? ? 15 4_173
? ? ? ? 16 4_174
? ? ? ? 17 4_174
? ? ? ? 18 4_174
? ? ? ? 19 4_174
? ? ? ? 20 4_174
?
20 rows selected.
?
linuxidc@MYDB>exec dbms_stats.gather_table_stats(ownname=>'ZX',tabname=>'T1',method_opt=>'for all columns size auto',cascade=>true,estimate_percent=>100);
?
PL/SQL procedure successfully completed.
?
linuxidc@MYDB>select index_name,clustering_factor from dba_indexes where index_name='IDX_T2';
?
INDEX_NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CLUSTERING_FACTOR
------------------------------------------------------------------------------------------ -----------------
IDX_T2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4


重复与表T1相同的一系列的操作,从结果可以看出索引IDX_T2的聚簇因子降为了4。而相邻的数据也都在同一数据块中。


在Oracle数据库里,CBO在计算索引范围扫描(Index Range Scan)的成本时会使用如下公???:


IRS Cost = I/O Cost + CPU Cost


而I/O Cost的计算公式为:


I/O Cost = Index Access I/O Cost + Table Access I/O Cost


Index Access I/O Cost = BLEVEL + CEIL(#LEAF_BLOCKS * IX_SEL)


Table Access I/O Cost = CEIL(CLUSTERING_FACTOR * IX_SEL_WITH_FILTERS)


从这个公式可以推断走索引范围扫描的成本可以近似看作是和聚簇因子成正比,因此,聚簇因子值的大小实际上对CBO判断是否走相关的索引起着至关重要的作用。


演示一个例子,通过修改聚簇索引的值就让原本走索引范围扫描的执行计划变成了走全表扫描:


linuxidc@MYDB>create table t1 as select * from dba_objects;
?
Table created.
?
linuxidc@MYDB>create index idx_t1 on t1(object_id);
?
Index created.
?
linuxidc@MYDB>select clustering_factor from dba_indexes where index_name='IDX_T1';
?
CLUSTERING_FACTOR
-----------------
? ? ? ? ? ? 1063
?
linuxidc@MYDB>select /*+ cluster_factor_expmple_1 */ object_id,object_name from t1 where object_id between 103 and 108;
?
?OBJECT_ID OBJECT_NAME
---------- ------------------------------
? ? ? 103 MIGRATE$
? ? ? 104 DEPENDENCY$
? ? ? 105 ACCESS$
? ? ? 106 I_DEPENDENCY1
? ? ? 107 I_DEPENDENCY2
? ? ? 108 I_ACCESS1
?
6 rows selected.
?
linuxidc@MYDB>select * from table(dbms_xplan.display_cursor(null,null,'all'));
?
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID? ga3jv3kwwwmx5, child number 0
-------------------------------------
select /*+ cluster_

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Oracle在线 redo log文件丢失后的.. 下一篇ORA-600 2662错误解决实例

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目