zoukankan      html  css  js  c++  java
  • Oracle学习----集群因子(Clustering Factor)

    1.集群因子的算法:
    通过dbms_rowid.rowid_block_number(rowid)找到记录对应的block 号。索引中记录了rowid,因此oracle 就可以根据索引中的rowid来判断记录是否是在同一个block 中。举个例子,比如说索引中有a,b,c,d,e五个记录,首先比较a,b 是否在同一个block,如果不在同一个block 那么Clustering Factor +1,然后继续比较b,c 同理,如果b,c 不在同一个block,那么Clustering Factor+1,这样一直进行下去,直到比较了所有的记录。根据算法我们就可以知道clustering factor 的值介于block 数和表行数之间。如果clustering factor 接近block 数,说明表的存储和索引存储排序接近,也就是说表中的记录很有序,这样在做index range scan 的时候能,读取少量的data block 就能得到我们想要的数据,代价比较小。如果clustering factor 接近表记录数,说明表的存储和索引排序差异很大,在做index range scan 的时候,会额外读取多个block,因为表记录分散,代价较高。
     
    2.什么是rowid?

    SQL> select rowid from t;

    ROWID
    ------------------
    AAASEzAAEAAAAFFAAA

    SQL> select length(rowid) from t;

    LENGTH(ROWID)
    -------------
    18

    rowid一共18位

    最前面6位表示data object number

    之后后3位表示datafile number

    之后后6位表示datablock number

    最后面3位表示row number

    3.如何根据rowid查询出来相应的块号等信息?

    SQL> select
    2 rowid,
    3 dbms_rowid.rowid_relative_fno(rowid) rel_fno,--返回rowid对应的文件号
    4 dbms_rowid.rowid_block_number(rowid) blockno,--返回rowid所在的块号
    5 dbms_rowid.rowid_row_number(rowid) rowno--返回该行数据在block中的相对位置
    6 from t where rownum=1;

    ROWID             REL_FNO  BLOCKNO   ROWNO
    ------------------------  ------------- ------------- -------
    AAASEzAAEAAAAFFAAA      4      325      0

    4.能改集群因子吗?重建索引会改变集群因子吗?

    不会,索引是根据创建时列的值排序创建的,只能create table .. order by 索引列,才能改变集群因子。

    5.集群因子是如何影响性能的?

    假设一个表有1千万行,只需要返回1w行数据,走索引。

    select * from t where rowid<=10000;

    走索引要先返回10000个rowid,回表要回10000次

    select * from test where rowid=xxxx
     
    假设10000个rowid在10个块中,那么回表时,物理回表只有10次
    耗时10*10ms
    假设10000个rowid在10000个块中,那么回表时,物理回表只有10000次
    耗时100000*10ms
     
    6.什么情况下集群因子不影响性能?
    1.不回表
    2.表都在buffer cache中
    3.返回数据少,主键扫描或走唯一索引就跟集群因子没有关系
     
    7.集群因子影响那个索引扫描?
    index range scan 
    index full scan
    index skip scan
    index fast full scan跟rowid没有关系,所以集群因子不影响
     
    8.反转建索引会导致集群因子的增加。

    SQL> create table test as select * from dba_objects;

    表已创建。

    SQL> create index objid on test(object_id);

    索引已创建。

    SQL> select index_name,clustering_factor from user_indexes where table_name='TEST';

    INDEX_NAME CLUSTERING_FACTOR
    ------------------------------------------------------------ -----------------
    OBJID 1085

    SQL> select count(distinct dbms_rowid.rowid_block_number(rowid))from test;

    COUNT(DISTINCTDBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))
    ---------------------------------------------------
    1027

    SQL> select count(*) from test;

    COUNT(*)
    ----------
    72063

    反转建立索引

    SQL> alter index objid rebuild reverse;

    索引已更改。

    SQL> select index_name,clustering_factor from user_indexes where table_name='TEST';

    INDEX_NAME CLUSTERING_FACTOR
    ------------------------------------------------------------ -----------------
    OBJID 72061

    SQL> select count(*) from test;

    COUNT(*)
    ----------
    72063

    SQL> select count(distinct dbms_rowid.rowid_block_number(rowid))from test;

    COUNT(DISTINCTDBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))
    ---------------------------------------------------
    1027

    9.sql实现集群因子的算法

    WITH T AS
    (SELECT OWNER COLUMN_NAME,
    LEAD(OWNER, 1, OWNER) OVER(ORDER BY OWNER) NEXT_COLUMN_NAME,
    ROWID ROWID_NUM,
    DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCK_ID,
    LEAD(ROWID) OVER(ORDER BY OWNER) NEXT_ROWID_NUM,
    LEAD(DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID),
    1,
    DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) OVER(ORDER BY OWNER) NEXT_BLOCK_ID
    FROM TEST A
    WHERE OWNER IS NOT NULL
    ORDER BY OWNER)
    SELECT COUNT(*) 记录数,COUNT(DISTINCT BLOCK_ID) BLOCK_ID_SUM,
    SUM(CASE
    WHEN T.BLOCK_ID = T.NEXT_BLOCK_ID THEN
    0
    ELSE
    1
    END) + 1 集群因子,
    SUM(CASE
    WHEN T.COLUMN_NAME = T.NEXT_COLUMN_NAME AND
    T.BLOCK_ID <> T.NEXT_BLOCK_ID THEN
    1
    ELSE
    0
    END) 值同_块不同
    FROM T;

     
     
     
  • 相关阅读:
    家居有线网络布线方案(转)
    ARP、Tracert、Route 与 NBTStat 命令详解(转)
    集线器、路由器、交换机、第三层交换技术(转)
    C#版nbtstat
    交换机常见故障的一般分类和排障步骤(转)
    Women guojia keneng zai 2015 nian qianhou wancheng di yi ci xiandaihua(拼音化汉字)
    IPv6协议在各操作系统下的安装与配置(转)
    具有字典验证的记事本
    子网掩码计算方法(转)
    最后推荐一篇关于PreEcho的总结论文
  • 原文地址:https://www.cnblogs.com/SUN-PH/p/4106143.html
Copyright © 2011-2022 走看看