DB_BLOCK_SIZE for your databasePCTUSED and PCTFREEOracle organizes data logically — independent of the operating system — in a four-level hierarchy
from smallest to largest. A data block is the smallest unit of storage, typically 2 KB, 4 KB, or
8 KB. An extent is a group of logically contiguous data blocks. A segment is a set of extents
allocated to a specific database object such as a table or index. A tablespace is a logical
container for segments, consisting of one or more physical data files.
A single logical data block maps to a fixed number of bytes on persistent storage. The database
always reads and writes in whole data block multiples, even when the operating system uses a
different native block size.
DB_BLOCK_SIZE initialization parameter sets this value at database
creation time and applies to the SYSTEM and SYSAUX tablespaces as well as all other tablespaces
by default. This parameter cannot be changed without recreating the database, so the choice must
be made carefully before the database is built.
DB_BLOCK_SIZE is permanent for the instance.
Managing the database buffer cache, which holds data blocks in memory for fast access, is
directly tied to this setting.
Oracle Databases can be deployed on up to 64,000 datafiles. Because a bigfile tablespace can
contain a file that is 1,024 times larger than a smallfile tablespace, and bigfile tablespaces
support 32 KB block sizes on 64-bit operating systems, an Oracle Database can grow to up to
8 exabytes in size — an exabyte is equivalent to a million terabytes. The bigfile tablespace is
designed for use with Oracle Automatic Storage Management (ASM), logical volume managers that
support striping, and RAID.[1]
Every Oracle data block has a consistent internal format regardless of whether it stores table
rows, index entries, or other segment types. The block header occupies the top of the block and
contains general information including the disk address, segment type, and transaction details
used for concurrency control. Below the header, the table directory holds metadata about the
tables whose rows are stored in the block. The row directory holds pointers to the physical
locations of each row within the block.
Row data is stored from the bottom of the block upward, while the header and directories grow
downward from the top. Free space sits between these two areas and is managed by the storage
parameters PCTFREE and PCTUSED. Rows are variable-length and Oracle
tracks each row via a rowid that encodes the datafile number, block number, and row position
within the block.
PCTFREE and PCTUSED. Understanding both is essential to avoiding row chaining and row migration, which are among the most common causes of excessive I/O in Oracle databases.
PCTFREE reserves a percentage of each block for future UPDATE operations that expand
column values. For example, with the default PCTFREE of 10, Oracle stops inserting
new rows into a block once 90 percent of the block is used, reserving the remaining 10 percent
for updates. Setting PCTFREE too low risks row chaining, where an UPDATE causes a
row to exceed the available space in its original block. Oracle must then store the overflow in a
chained row on a separate block, requiring two block reads to retrieve a single row and
significantly increasing I/O overhead.
PCTUSED determines the minimum percentage of used space that must be present in a
block before Oracle returns it to the freelist for new inserts. Once a block's used space falls
below the PCTUSED threshold due to DELETE operations, Oracle re-links it to the
freelist and allows new rows to be inserted. Together, PCTFREE and
PCTUSED define the insertion window for each block and directly affect both space
utilization and performance.
In Oracle 23ai, tablespaces are typically locally managed by default, using bitmaps in datafile headers to track free and used extents efficiently. Within locally managed tablespaces, Automatic Segment Space Management (ASSM) uses bitmaps inside the segment itself to track free space at the block level. ASSM eliminates the need to manually manage freelists and freelist groups, simplifies administration, and improves concurrency for high-insert workloads compared to older dictionary-managed or manual freelist methods.
ALTER TABLE table_name SHRINK SPACE;
Index range scans navigate the B-tree index structure directly and are not affected by the HWM.
Only full-table scans are subject to the HWM boundary.
PCTFREE
settings and can be eliminated by setting PCTFREE to an appropriate value for the
table's UPDATE patterns.
Migrated rows can be detected by querying V$SYSSTAT for the table fetch continued
row statistic, or by running the ANALYZE TABLE ... LIST CHAINED ROWS command. Once
identified, migrated rows are resolved by exporting and reimporting the table, or by using online
table redefinition with DBMS_REDEFINITION.
DB_BLOCK_SIZE parameter setting in detail.