一、概述
如果你的Oracle数据库性能低下,行链接和行迁移可能是其中的原因之一。我们能够通过合理的设计或调整数据库来阻止这个现象。
行链接和行迁移是能够被避免的两个潜在性问题。我们可以通过合理的调整来提高数据库性能。本文主要描述的是:
● 什么是行迁移与行链接
● 如何判断行迁移与行链接
● 如何避免行迁移与行链接
当使用索引读取单行时,行迁移影响OLTP系统。最糟糕的情形是,对所有读取操作而言,增加了额外的I/O。行链接则影响索引读和全表扫描。
注:在翻译行(row)时使用记录来描述(便于理解),如第一行,使用第一条记录。
二、Oralce 块
操作系统块的大小是操作系统读写的最小操作单元,也是操作系统文件的属性之一。当创建一个数据库时,选择一个基于操作系统块的整数倍大小作为Oracle数据库块的大小。Oracle数据库读写操作则是以Oracle块为最小单位,而非操作系统块。一旦设置了Oracle数据块的大小,则在整个数据库生命期间不能被更改(除 Oracle 9i之外)。因此为Oracle数据库定制合理的Oralce块大小,象预期数据库总大小以及并发用户数这些因素应当予以考虑。
数据库块由下列逻辑结构(在整个数据库结构下)
头部:头部包含一些常用信息,象块地址,段的类型(表段、索引段等)。也包含一些表、实际数据行的地址信息等。
空闲空间:用于保留给后续DML(update/insert)操作的空间。通常受pctfree和pctused参数的影响。
数据:实际的数据内容
FREELIST, PCTFREE, PCTUSED
当创建或修改任意表,索引时。Oracle使用两个存储参数来控制空间的分配
PCTFREE 为已存在数据将来更新需要保留空闲空间的百分比
PCTUSED 新插入数据可使用空间的最小百分比,该值决定块何时回收到 freelist 结构中
FREELIST Oracle通过维护该列表来记录或更新所有可用的数据块
Oracle 首先在freelist列表上搜索可用的空闲数据块,搜索成功之后将数据插入到那个空闲块。块在free list 列表中的可用性由pctfree参数值来决定。起初一个空块在freelist列表上列出,并且会一直保留,直到到空闲空间达到pctfree设定的值。
当一个块被使用且达到pctfree设定的值之后则该块从freelist列表被移除,而当数据块的可用空间低于PCTUSED值的时候,该块又会回收,即重新回到freelist列表。
Oracle使用freelist方式以提高数据库性能。因此,每一个insert 操作,Oracle 仅仅需要搜索freelist结构,而不是搜索所有数据块。