Oracle索引聚簇因子的含义及重要性(2)

从上述显示结果可以看出1、3、5、7、9在4号文件的300号数据块内,11、13、15、17、19在4号文件的301号数据块内,2、4、6、8、10在4号文件的第302号数据块内,12、14、16、18、20在4号文件的第303号数据块内。

收集统计信息并查看聚簇因子的值

#收集统计信息并查看聚簇因子的值
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_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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/349ddeb7769cf4404799ace306a7165d.html