Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133964
  • 博文数量: 35
  • 博客积分: 1002
  • 博客等级: 准尉
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-03 14:30
文章分类

全部博文(35)

文章存档

2014年(7)

2013年(8)

2011年(4)

2010年(9)

2009年(7)

我的朋友

分类: Oracle

2013-01-06 11:26:28

我们在查询索引状态的时候,通常会用到user_indexes这张表,这张表中有一列(CLUSTERING_FACTOR 聚簇因子),这里简单的介绍下聚簇因子的意思,大家知道数据表中的数据都是无序的存在库中,当我们在对数据进行检索的时候,查找起来很是耗费资源,于是我们就需要为表创建索引,索引的作用就是把表中的数据按照一定的顺序排列保存起来,于是就出现了一个问题,有的表中的数据和索引想要排列的顺序很是相近,而另一些表中的数据和索引想要排列的顺序相距甚远,聚簇因子的作用就是用来标示这个的,聚簇因子越小,相似度越高,聚簇因子越大,相似度越低。

     我们知道了聚簇因子是干嘛的了,但是还不了解标示数据的相似度有何意义,我们继续讨论:

     oracle在存储数据的时候,并不是按照数据块的顺序挨个进行存入数据,因为前面存入的数据经常会有dml或者ddl操作,删除数据后,原先存有数据的数据块就变成了空块,oracle为了节省存储空间,当数据库再次有新数据进行插入的话,就会优先使用那些空块,只有当空块不够使用的时候,才会去高水位以上开辟新块,这种情况也就会导致,一张表中的数据,并不是存储在相邻的数据块中,于是聚簇因子变的很大,当这种情况进行逻辑读取的时候,就会增加IO的次数,影响了读取的速度。

     既然说聚簇因子关系着表的读取速度,那么我们能够手工控制聚簇因子的大小吗?

    答案是肯定的,但是事情总是有利也有弊,

 1)我们可以对表进行重构(alter table emp move);

 2)或者按照索引的顺序重建表(create table emp_bk as select * from emp        order by empno);

 3)可以在高水位以上开辟足够的新块,把一张表的数据全部存入这里,以达到降低    聚簇因子的目的,但是带来的结果也就是空间的浪费,同时因为高水位线是全表    扫描的终点,人为的拔高了水位线,容易造成全表扫的速率降低,因此需要慎重    考虑。

 4)创建分区表,以减少对数据块的访问

  例如 emp表中,雇员共分3个部门(deptno:10,20,30),我们按照部门号进行分区:

 

  create table EMP

(

  empno    NUMBER(4) not null,

  ename    VARCHAR2(10),

  job      VARCHAR2(9),

  mgr      NUMBER(4),

  hiredate DATE,

  sal      NUMBER(7,2),

  comm     NUMBER(7,2),

  deptno   NUMBER(2)

)

partition by list(deptno)

(partition dept_10 values(10),

partition dept_20 values(20),

partition dept_30 values(30),

partition dept_other values(default));

当我们执行 select * from emp where deptno=10; 时,oracle会将不属于10分区的其他分区,全部剔除出去,只访问10部门分区。

查看10部分分区:select * from emp partition(dept_10);

阅读(450) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~