FreeSpace Management 可用空间的管理
Freespace can be managed automatically or manually.
Freespace can be managed automatically inside database segments. The in-segmentfree/used space is tracked using bitmaps, as opposed to free lists. Automaticsegment-space management offers the following benefits:
■ Ease of use
■ Better space utilization, especially for the objects with highlyvarying row sizes
■ Better run-time adjustment to variations in concurrent access
■ Better multi-instance behavior in terms of performance/spaceutilization
可用空间的管理方式有两种:自动管理和手工管理。
数据库段中的可用空间是自动管理的。段内的可用/已用空间以位图(bitmap)形式记录,这与可用块以列表方式的管理不同。段空间自动管理(Automatic segment-space management)具备以下优势:
■易于使用
■空间利用效率更高,尤其针对每行数据容量差异大的表(或其他对象)
■能够更好地针对当前数据的情况实时调整
■Better multi-instance behavior in terms ofperformance/space utilization
Youspecify automatic segment-space management when you create a locally managed tablespace.Thespecification then applies to all segments subsequently created in thistablespace.
用户可以在创建一个本地管理的表空间(locally managed tablespace)时选择自动段空间管理(automatic segment-space management)功能。这样在此表空间内创建的段都将默认地设置为自动段空间管理。
Availabilityand Optimization of Free Space in a Data Block
数据块可用区的优化和有效性
Two types of statements can increase the free space of one or more data blocks:DELETE statements, and UPDATE statements that update existing values to smaller values. The released space from these types of statements is available for subsequent INSERT statements under the following conditions:
■ If the INSERT statement is in the same transaction and subsequent to the statement that frees space, then the INSERT statement can use the space made available.
■ If the INSERT statement is in a separate transaction from the statement that frees space (perhaps being run by another user), then the INSERT statement can usethe space made available only after the other transaction commits and only ifthe space is needed.
有两种语句可用增加数据块中的可用空间区:delete语句和将现有数据更新为占用空间更少的update语句。在以下两种条件下,上述两中操作释放的空间可以被后续的INSERT 语句使用:
■如果 INSERT 语句与上述两种操作在同一事务(transaction)中,且位于释放空间的语句之后,那么 INSERT 语句可以使用被释放的空间。
■如果 INSERT 语句与释放空间的语句在不同的事务中(比如两者是由不同的用户提交的),那么只有在释放空间的语句提交后,且插入数据必需使用此数据块时,INSERT 语句才会使用被释放的空间。
Released space may or may not be contiguous with the main area of free space in a data block. Oracle coalesces the free space of a data block only when (1) an INSERT or UPDATE statement attempts to use a block that contains enough free space to contain a new row piece, and (2) the free spaceis fragmented so the row piece cannot be inserted in a contiguous section of the block. Oracle does this compression only in such situations, because otherwise the performance of a database system decreases due to the continuous compression of the free space in data blocks.
数据块(data block)中被释放出的空间未必与可用空间区(free space)相连续。Oracle在满足以下条件时才会将释放的空间合并到可用空间区:(1)INSERT 或 UPDATE 语句选中了一个有足够可用空间容纳新数据的数据块,(2)但是此块中的可用空间不连续,数据无法被写入到数据块中连续的空间里。Oracle只在满足上述条件时才对数据块中的可用空间进行合并,这样做是为了避免过于频繁的空间合并工作影响数据库性能。
Row Chaining andMigrating 行链接和行迁移
In two circumstances, the data for a row in a table may be too large to fit into a single data block. In the first case,the row is too large to fit into one data block when it is first inserted. In this case, Oracle stores the data for the row in a chain of data blocks (one or more) reserved for that segment. Row chaining most often occurs with large rows, such as rows that contain a column of datatype LONG or LONG RAW . Row chaining in these cases is unavoidable.
有两种情况会导致表中行数据太大无法放入单个的数据块中。第一种情况,行数据在初次被插入的时候因为太大而不能放入单个的数据块中。这种情况下,oracle会将这行数据以数据块(一个或多个数据块)链接的方式存储在段中。行链接最常发生在插入大数据行的情况下,比如在行中包涵有Long或Long Raw类型的列的时候。这种情况下的行链接是不可避免的。
However, in the second case, a row thatoriginally fit into one data block is updated so that the overall row lengthincreases, and the block’s free space is already completely filled. In thiscase, Oracle migrates the data for the entire row to a new data block, assumingthe entire row can fit in a new block. Oracle preserves the original row pieceof a migrated row to point to the new block containing the migrated row. Therowid of a migrated row does not change.
不过,还有第二种情况,本来已经放入一个数据块中的行数据因为更新导致整条行数据变长,而更新前的数据块的可用空间区也已经完全的被填满了。这种情况下,如果整行数据能够放入到一个新的数据块中,oracle会将整行数据从当前的数据块迁移到这个新的数据块中。Oracle在被迁移数据行原来所在位置保存一个指向新数据块(该数据块中有被迁移的行数据)的指针。被迁移数据行的 rowid 保持不变。
When arow is chained or migrated, I/O performance associated with this row decreasesbecause Oracle must scan more than one data block to retrieve the informationfor the row。
当发生行链接或者行迁移后,这行数据的I/O性能会降低,这是因为oracle为获取到这行数据的信息必须扫描不止一个数据块才行。