4 聚簇因子--优化主题系列

来源:互联网 发布:embed标签 js控制 编辑:程序博客网 时间:2024/05/16 02:09

聚簇因子(ClusteringFactor)用来描述一个表中的列是否是规则排序的。它的算法如下:

 

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

 

SQL优化时聚簇因子用得太少

举个例子实战中如何用的

假设索引扫描时要扫描1000条记录

我现在把1000条记录找到了

是不是要根据1000条记录所对应的ROWID去访问原表??

 

假设聚簇因子很低 1000ROWID都在同一个块中

回表时扫描多少次?1000对吧

第一次是物理读后面999次都在内存中读走逻辑读

 

假设1000ROWID分别在1000个块中

是不是1000次均为物理读??

 

假设cache读内存的速度是读磁盘速度的多少倍??

请问重建索引能否降低聚簇因子??

聚簇因子是衡量表中数据分布情况

如何改变聚簇因子??

create table as select ... order by ...

 

聚簇因子到底干嘛的?

聚簇因子很高我走全表扫描有没有影响??

聚簇因子肯定跟索引扫描有关

如果是INDEXUNIQUE SCAN聚簇因子会不会影响??

聚簇因子有影响只能在分会多条记录的情况下才能起作用

rangescanfullscanskipscanfast full scan不是的

把表都KEEPKEEP POOL

 

如果遇到聚簇因子与表的行数接近的这种索引如何处理??

一般情况下聚簇因子调优没法做所以聚簇因子不实用

总结:聚簇因子是用来衡量索引扫描时通过ROWID回表I/O的物理次数

 

SQL优化的最终目的---较少物理I/0其次较少逻辑I/O

 

较少物理I/O 是因为物理I/O是最耗费时间的

较少逻辑I/O 则是减少CBC争用因为读一个block就会引发一个latch