聚簇因子


聚簇因子的值表示了表中行的有序程度,这个值与块数接近时,说明表有序程度很好,得到了很好的组织。在这种情况下,同一个叶子块中的索引条目可能
指向同一个数据块上的行。聚簇因子与行值相近时,表的次序是非常随机的,同一个叶子块上的索引条目不太可能指向同一个数据块上的行。

下面先建立两张表,一张建立索引的列非常有序,另一张表建立索引的列非常无序,就是tom书上的例子。

SQL> create table colocated ( x int, y varchar2(80) );

表已创建。

SQL> begin
  2      for i in 1 .. 100000
  3      loop
  4          insert into colocated(x,y)
  5          values (i, rpad(dbms_random.random,75,'*') );
  6      end loop;
  7  end;
  8  /

PL/SQL 过程已成功完成。

SQL> alter table colocated
  2  add constraint colocated_pk
  3  primary key(x);

表已更改。

SQL> begin
  2  dbms_stats.gather_table_stats( user, 'COLOCATED', cascade=>true );
  3  end;
  4  /

PL/SQL 过程已成功完成。

上面是有序表

SQL> create table disorganized
  2  as
  3  select x,y
  4    from colocated
  5   order by y;

表已创建。

SQL> alter table disorganized
  2  add constraint disorganized_pk
  3  primary key (x);

表已更改。

SQL> begin
  2  dbms_stats.gather_table_stats( user, 'DISORGANIZED', cascade=>true );
  3  end;
  4  /

PL/SQL 过程已成功完成。

这个是无序表

通过user_indexes可以查看聚簇因子的值

SQL> select a.index_name,
  2         b.num_rows,
  3         b.blocks,
  4         a.clustering_factor
  5    from user_indexes a, user_tables b
  6  where index_name in ('COLOCATED_PK', 'DISORGANIZED_PK' )
  7    and a.table_name = b.table_name
  8  /


INDEX_NAME                       NUM_ROWS     BLOCKS CLUSTERING_FACTOR
------------------------------ ---------- ---------- -----------------
COLOCATED_PK                       100000       1252              1190
DISORGANIZED_PK                    100000       1219             99926


在查看两张表块的情况

SQL> select table_name, blocks
  2  from user_tables
  3  where table_name in ( 'COLOCATED', 'DISORGANIZED' );

TABLE_NAME                                                       BLOCKS
------------------------------------------------------------ ----------
COLOCATED                                                          1252
DISORGANIZED                                                       1219


可以看出有序表colocated聚簇因子值非常接近blocks值,而无序表的值非常接近表的行数100000行。

聚簇因子也可以看作通过索引读整个表时对表的逻辑I/O。


SQL> alter session set sql_trace=true;

会话已更改。

SQL> select count(y) from
  2  (select /*+ index(colocated colocated_pk)*/ * from colocated);

  COUNT(Y)
----------
    100000

  1
SQL> select count(y) from
  2  (select /*+ index(disorganized disorganized_pk)*/ * from disorganized)
  3  /

  COUNT(Y)
----------
    100000

下面是TKPROF的内容:

select count(y) from
(select /*+ index(colocated colocated_pk)*/ * from colocated)

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.04          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.15       0.14          0       1399          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.17       0.18          0       1399          0           1



Rows     Row Source Operation
-------  ---------------------------------------------------
      1  SORT AGGREGATE (cr=1399 pr=0 pw=0 time=147829 us)
 100000   TABLE ACCESS BY INDEX ROWID COLOCATED (cr=1399 pr=0 pw=0 time=1200067 us)
 100000    INDEX FULL SCAN COLOCATED_PK (cr=209 pr=0 pw=0 time=400045 us)(object id 54173)
 
 
可以得出对表执行的逻辑io为1399-209=1190,与该表的聚簇因子值相等。


********************************************************************************

select count(y) from
(select /*+ index(disorganized disorganized_pk)*/ * from disorganized)

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.37       0.38          0     100135          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.37       0.38          0     100135          0           1


Rows     Row Source Operation
-------  ---------------------------------------------------
      1  SORT AGGREGATE (cr=100135 pr=0 pw=0 time=380757 us)
 100000   TABLE ACCESS BY INDEX ROWID DISORGANIZED (cr=100135 pr=0 pw=0 time=1500061 us)
 100000    INDEX FULL SCAN DISORGANIZED_PK (cr=209 pr=0 pw=0 time=500041 us)(object id 54175)
 
 可以得出对表执行的逻辑io为100135-209=99926,与该表的聚簇因子值相等。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25361369/viewspace-710518/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25361369/viewspace-710518/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值