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会自动管理,所以大部分情况请忽略掉这个参数吧.