Oracle 段区块 分配 (2)

 
接上文 Oracle 段区块 分配 (1)

, oracle 的行迁移和行链接. (
Row Chaining and Migrating)
   
上面提过了, oracle是允许把多个数据行放到同1个块中的。
     而且, oracle会尽量把同1个数据行的所有数据放到同1个块中, 这样避免读取1个数据行要访问2个或以上的块.

     而oracle是怎么避免这个问题呢。1个关键就是pctfree 和 pctused 的设置

     
6.1 pctfree
    
这个参数在新建1个table/cluster的时候可以被指定。  默认是10%

      假如 pctfree 的值是10%, 那么1个block的剩余空间一但只剩下10%时, 这个block就不允许insert 新的数据行入来了。
      那么这个10% 空间是否就没用呢, 不是, 它用于预留给这个block 当前存在的数据行
数据行因为update操作而造成的数据增长。

         也就是说当1个block的剩余空间减少到pctfree的值时。 就不允许被insert 新的数据行了。但是里面的数据允许被update或delelte.

         这样做的好处是避免因为update动作, 导致blocks的里面空间不够用. 当因为这种情况出现时, 那么其中一条或多条数据行的数据就在这个block里装不下了。

         6.2 行迁移
        因为上面的出现的情况
         oracle就会把这个整个行移动另1个块(很可能不是物理连接的下1个块),而在原来那个block那个行原来位置写上1个指针。指向被转移到的那个新block的地址(编号)。 这个就是行迁移( Row chainnig)

         这个情况下, 为了读取这个数据行。 就必须读取两个块。 性能下降了。
         所以行迁移的出现通常是因为pctfree过少。 被一次update动作挤暴..
         行迁移多了,就会导致数据表性能下降。

         6.3 行链接

    
上文说过了, Oracle会尽最大努力把1个数据所有行放如到1个中/
      但是当1个数据行数据实在太大(大于块的容量), 这时就必需用2个或以上的block来存放这个数据行。

      链接同样会导致访问1个数据行而访问多个blocks

      而行链接通常是因为blocksize大小不足导致的。 所以如果一张表的列很多很长, 建议把它放到blocksize 比较大的表空间中。


    
         6.4 查看行迁移和行链接.
 
SELECT table_name,NUM_ROWS, --表中的记录数
BLOCKS, --表中数据所占的数据块数 //高水位线
EMPTY_BLOCKS, --表中的空块数
AVG_SPACE, --数据块中平均的使用空间
CHAIN_CNT, --表中行连接和行迁移的数量
AVG_ROW_LEN --每条记录的平均长度
FROM DBA_TABLES where table_name='EMP'


利用如上语句去查看 行迁移的或行链接的数量。
如果chain_cnt的值很大。   那么就要查看avg_row_len 平均长度。 如果行平均长度很小,远小于blocksize, 那么这个问题就很可能是行迁移导致的, 这时我们就要调整pctfree的大小。

如果avg_row_len的值很接近blocksize, 则可以判断肯定是发生了行链接了。 建议把表转移到blocksize较大的表空间。       



        6.5 pctused
     
那么是否block的剩余空间一旦触发pctfree,就永远不能被Insert新数据行呢。
       时pctused 的作用就出来了, 假如pctused设置为40%

       当这个block里面的数据被delete 或update造成了数据减少, 当数据减少到40%时, 这时pctfree的限制被接触。又能被insert新的数据了,直至重新触发pctfree.

       但是在段的管理模式是自动管理模式(强烈推荐的模式)下,设置这个参数是没意义的.所以
oracle会自动管理,所以大部分情况请忽略掉这个参数吧.

posted @ 2013-04-02 00:58  Gateman  阅读(359)  评论(0编辑  收藏  举报