This module builds on the foundational understanding of data blocks, the data dictionary, and data structures covered in prior modules. With that foundation in place, you are ready to examine the Oracle partitioning facility — one of the most consequential features available for tuning and managing large-scale Oracle databases.
Partitioning addresses a class of performance and manageability problems that no amount of index tuning, SQL rewriting, or buffer cache sizing can solve: the problems that arise when a table or index simply becomes too large to operate on as a single unit. By the time you complete this module you should be able to:
Partitioning allows a table, index, or index-organized table to be subdivided into smaller pieces. Each piece is called a partition. Each partition has its own name and may optionally have its own storage characteristics — its own tablespace, compression setting, or physical storage location.
From the perspective of a DBA, a partitioned object has multiple pieces that can be managed either collectively or individually, providing considerable administrative flexibility. A partition can be backed up, restored, moved, compressed, or dropped without affecting the other partitions in the same table. Maintenance windows that would otherwise require taking an entire large table offline can instead target a single partition while the rest of the table remains fully available.
From the perspective of the application, a partitioned table is identical to a non-partitioned table. No SQL modifications are necessary to query or perform DML against a partitioned table. Partitioning is transparent to the application layer — the same SELECT, INSERT, UPDATE, and DELETE statements work unchanged, while the database engine routes operations to the correct partition automatically.
Four capabilities distinguish partitioned objects from their non-partitioned equivalents and directly affect performance at scale:
The diagram above shows the structural difference between the two approaches. Table 1 — the nonpartitioned table — stores January through March data in a single segment. Any query against that table, regardless of how narrow its date filter, must potentially scan the entire segment. Any maintenance operation on that table affects the entire object.
Table 2 — the partitioned table — stores the same data in three independent partition segments, one per month. A query filtering on February reads only the February partition. The January and March partitions are not accessed. A maintenance operation on the March partition does not affect January or February data. Both tables can have partitioned or nonpartitioned indexes applied to them; partitioning the table does not dictate the index strategy.
The choice between a partitioned and nonpartitioned index depends on the access pattern and maintenance requirements. A local partitioned index is co-located with its partition, making partition-level maintenance straightforward. A global nonpartitioned index provides better support for queries that do not filter on the partition key but requires more careful management during partition DDL operations.
Oracle supports four primary partitioning strategies, each suited to different data distributions and access patterns. Composite partitioning combines two strategies at two levels — a primary partitioning method and a subpartitioning method within each primary partition.
Range partitioning divides data based on a range of values in a partition key column. Date-based partitioning is the most common application: a sales table partitioned by month stores January data in one partition, February in the next, and so on. Range partitioning delivers the most predictable partition pruning for queries filtered on sequential or continuous values. It is the natural choice for time-series data, financial records, and any dataset where queries are predominantly filtered on a date or sequence range.
List partitioning divides data based on discrete, enumerated values in a partition key column. A sales table might be partitioned by region — North, South, East, West — with each region's data in its own partition. List partitioning is effective when the partition key has a small, known set of values and queries commonly filter on those values. It provides clean logical separation of data that does not have a natural ordering.
Hash partitioning applies a hash function to the partition key and distributes rows across a specified number of partitions based on the hash result. The distribution is approximately even across all partitions regardless of the key value distribution. Hash partitioning does not support partition pruning by key value — the optimizer cannot determine which partition contains a specific key value without hashing it — but it provides excellent parallel query and parallel DML performance because all partitions are equally sized. It is the preferred strategy when data does not have a natural range or list key but parallel processing is a priority.
Interval partitioning is an extension of range partitioning introduced in Oracle 11g and continued in Oracle 23ai. It automatically creates new partitions as data arrives for a new range interval. A monthly interval-partitioned table automatically creates a new partition when the first row for a new month is inserted, without any DBA intervention. This eliminates the operational overhead of pre-creating future partitions and ensures that data is never rejected for falling outside defined partition boundaries.
A very large database (VLDB) has no minimum absolute size — the designation refers to the operational and administrative challenges that arise from scale, not from a specific byte threshold. Full backups, index rebuilds, optimizer statistics gathering, and bulk data loads are routine operations on small databases. At VLDB scale these same operations become time-prohibitive or cost-prohibitive without a strategy for dividing the work into manageable units.
Three sustained trends have driven the growth of enterprise database sizes:
Partitioning is the Oracle feature that addresses these growth challenges directly. It enables a divide-and-conquer approach to table and index management: instead of treating a 10TB table as a single monolithic object, partitioning breaks it into segments that can be individually administered, independently indexed, and selectively queried. The result is that a database can scale for very large datasets while maintaining consistent query performance and predictable maintenance windows — without requiring proportional increases in DBA headcount or hardware resources.
The high water mark problem from the previous module illustrates the point. A 10TB table from which 8TB of data has been deleted still scans at 10TB cost until the HWM is reset. A 10TB partitioned table from which the oldest two years of data have been dropped has had its HWM automatically reset on the dropped partitions — partition drop is an instantaneous metadata operation that immediately reclaims space and eliminates the empty-block I/O that would otherwise persist until a full table reorganization.
Oracle 23ai continues to support and extend the partitioning feature set introduced in Oracle 8i. The foundational concepts covered in this module — partition pruning, local versus global indexes, partition loading, and index maintenance — are unchanged and remain the basis for all partitioning work regardless of Oracle version. Several 23ai-specific extensions are worth noting as context for the lessons ahead:
DBMS_AUTO_INDEX.REPORT_ACTIVITY.INMEMORY clause can be applied at the partition
level, allowing hot partitions to be served from memory and cold partitions from disk without
splitting the table.