攻略1-15 积极预防行迁移/行链接的产生

问题描述

你注意到有一张表经常会遇到行迁移和/或行链接。你需要积极预防这个问题的发生。

解决方案

一个数据块中所保留的空闲空间取决于表的存储参数PCTFREE。PCTFREE的默认值为10,也就是说10%的数据块空间被保留,以便在进行导致需要更多空间的更新时使用。如果有一张表,初始插入很小的值或空值,但后来被更新为很大的值,则可以考虑将PCTFREE设置为更高的值,例如40%。这将有助于避免行迁移。但是,要记住更高的PCTFREE值可能会导致出现更多的行链接。

在插入数据后计算一下数据行的平均长度,然后对数据行进行典型的更新,再重新计算其长度可能有所帮助。这将给出数据行将会增长多少的信息(关于计算数据行长度的更多信息,参考攻略1-14)。

如果表中的数据在初始插入之后永远也不会更新,则可以考虑将PCTFREE设置为0。这可以使得数据块中能够容纳的数据行数最大化,从而在获取数据时减少磁盘读取的次数(也就得到更好的性能)。

工作原理

可以通过查询DBA/ALL/USER_TABLES视图来查看PCTFREE值,例如:

enter image description here

移动表几乎总是可以解决行迁移问题。移动运算从数据块中删除每一条记录,然后再将这些记录重新插入到新的数据块中。对于行迁移的数据行,旧的迁移数据被删除了,在另一个数据块中重建为一个物理行。

只有在行链接的数据行长度比空数据块中的空闲空间小的时候,才可能解决行链接问题。如果行链接的数据行长度比空数据块的空闲空间还要大,则可以考虑将PCTFREE设置为更小的值,然后再移动表,或者创建一个具有更大数据块大小的表空间。

目录