Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 2

PCTUSED is a block storage parameter used to specify when Oracle should

consider a database block to be empty enough to be added to the freelist.


Oracle will only insert new rows in blocks that is enqueued on the freelist. For
example, if PCTUSED=40, Oracle will not add new rows to the block unless
sufficient rows are deleted from the block so that it falls below 40% empty.
PCTFREE is a block storage parameter used to specify how much space
should be left in a database block for future updates. For example, for
PCTFREE=10, Oracle will keep on adding new rows to a block until it is 90%
full. This leaves 10% for future updates (row expansion).

The PCTFREE and PCTUSED parameters tell Oracle when to link and unlink a block
from the freelist chain. The following discussion only applies if you are not using the
new Automatic Segment Space Management (ASS Management).

The ASS management tablespace is new in Oracle9i and is implemented by adding the
SEGMENT SPACE MANAGEMENT AUTO clause to the tablespace definition. ASM
tablespaces automate freelist management and remove the ability to specify PCTFREE,
PCTUSED, FREELISTS, and FREELIST GROUPS storage parameters.

The setting for PCTFREE sets the value for the percent of a block to reserve for updates.
A block will remain on a FREELIST until it reaches blocksize * (1-(ptcfree/100)) full or
greater. Here are the main issues with incorrect settings:

• High migrated/chained rows - If PCTFREE is to small, adequate space may not


be reserved in the block for update of variable sized rows in the block, or, may not
have enough space for a complete row insert. In this case a block chaining will
occur where the data is migrated to a new block and a pointer will be established
from the old block to a new block.

• High I/O - This will result in doubling the IO required to retrieve this data. For
new data blocks, the space available for inserts is equal to the block size minus
the sum of the block overhead (84-107 bytes) and free space (PCTFREE/100 *
blocksize). When you update existing data Oracle uses any available space in
the block. So, updates will eventually reduce the available space in a block to less
than PCTFREE, the space reserved for updates but not accessible to inserts. This
removes the block form the freelist on which it resides.

The un-link process

Blocks with total filled volume less than BLOCKSIZE – overhead – (blocksize*(1-
(PCTFREE/100)) are available for inserts. When you issue an INSERT statement, Oracle
checks a free list of the table for the first available data block and uses it if possible. If the
free space in the selected block is not large enough to accommodate the data in the
INSERT statement, and the block is at least filled to the value PCTUSED, then Oracle
will remove the block from the free list. Multiple free lists for each segment can reduce
contention for free lists when concurrent inserts take place.

The Re-link Process

After processing a DELETE or UPDATE statement, Oracle checks to see if the space
being used in the block is now less than (BLOCKSIZE – overhead) * PCTUSED/100. If
it is, then the block goes to the beginning of the transaction free list, and it is the first of
the available blocks to be used in that transaction. However, it is only when the
transaction commits, that the free space in the block becomes available for other
transactions.

For tables with high levels of updates, setting PCTFREE to a high value is suggested, for
blocks which are never updated, then set this to a low value. For example, for a high
update table a setting of 40-50 is acceptable, while for a low or no update table (such as
in a data warehouse) a setting of 5 or less is acceptable. PCTUSED must be set to less
than 100-PCTFREE and should be set such that PCTFREE+PCTUSED is less than 100.
If PCTFREE+PCTUSED=100 this can result in see-sawing of the block on and off the
free lists which can be a performance issue.

2. 34. 1. Writing Multiple Row Subqueries


A multiple row subquery returns one or more rows to the outer SQL statement.
The outer query may use the IN, ANY, or ALL operator to handle a subquery that returns multiple ro

You might also like