oracle cluster tables 聚簇表
I/O往往是一个事务最浪费请求时间的过程,磁盘I/o的代价是非常大的,因为数据库请求一个磁盘文件中的BLOCK,在read的过程中必须等待物理I/O操作成功完成。
read 一行数据磁盘I/O要比一个从buffers中加载要慢1万倍(在oracle中大概是100多倍,因为latch的开销),因次要做的是尽可能的减少I/O或磁盘竞争要提示oracle数据库的性能。
比如查询一个大student表中三班的学生,如果是无充的表可能会发现很多的i/o,因为每行有可能在多个不同的块上,而且oracle是行级存储也叫块级存储,读一行的数据也要加载整块的数据
而如果我们把相似的数据放在一起,意思有点像index中clustering_factor,那我们就read所有行的数据就可以单个块中得到相仿数据,那就可以用10g hash cluster tables,单表聚簇或者手动 create table as xxx order by xx;
在oltp环境中数据通过主键访问行数据,按相同的主键属性有序的排序表中的数据行可以减少物理I/O,提高响应速度在索引驱动的表中,但是只有当应用查询多行时或者用index-range-scans或多个请求访问连续key值是才能从这种技术中受益,如果数据库只是随机的主键唯一上查询对于有序表并不明显益处。
Oracle Index Cluster Tables
Index Cluster Tables不像hash cluster 已经hashed 数据block地址,index cluster 而是用一个索引来维护行的顺序
一个table cluster 是一组共享相同数据块的表,他们是共同共享和使用,当建立了cluster tables,oracle就会物理的存储每个表的所有相同数据块的行,簇键的值是行的群集键列的值。
簇索引表可以是多个表也可以是单个表
比如
SQL> select * from scott.dept d natural join scott.emp where deptno='30';
如果deptno 30有5个emp,而如果emp 在不同的block上,我们必须fetch 6 个blocks返回查询行,即使已在buffer中也有至少6个一致读
1dept block,5emp block.
如是重定义为index cluster table,Oracle将物理存储dept相同 data block row,减小5 个read
emp db | emp db | dept data block | emp db | emp data block |
note: index cluster 只会减少通过cluster index 访问的数据是的I/O,通过其它index还会是随机block提取.
A single-table index cluster table 是一种保持 clustering_factor in dba_indexes总是接近block in dba_tables 的方法.
通过index range scan总是及可能通过一次I/O提取更多的行,取决于block size和average row length,所以有的single-table index cluster table 会用db_32k_cache_size.
如果一个块上没有足够的空间来容纳所有相似的block,就会先溢出块,有点像行链接,所以dba会把pctfree设的更小,如果溢出块过多也会影响clustering_factor.
对不起,这篇文章暂时关闭评论。