2026-07-22 · 4 min read

Partitioning Oracle for IoT Scale Without Downtime

By Dave Herrington

There's a specific moment in the life of an always-on system built on Oracle when the data model stops keeping up. Sensor readings, device events or telemetry have been accumulating for a couple of years, the tables are enormous, and the nightly purge job that removes expired data has quietly grown from twenty minutes to several hours — eating into the window everything else depends on.

The instinct is to tune the purge. The better answer is usually to stop deleting rows altogether.

Why DELETE stops working

Deleting a large volume of rows is one of the most expensive things you can ask a database to do. Every row generates undo and redo. Indexes have to be maintained. The blocks left behind are fragmented and sparsely populated, so the full scans that follow read more blocks to return the same data. The purge gets slower every month, precisely as the data volume that made it necessary keeps growing.

For time-series data with a retention policy, this is the wrong shape of operation entirely. You aren't really deleting rows — you're expiring a time range. The database has a mechanism designed for exactly that.

Partition by time, drop by metadata

Range partitioning on the timestamp column — typically daily or monthly, depending on volume and retention — changes the economics completely.

Purging becomes instant. Dropping a partition is a metadata operation. It doesn't scan the data, doesn't generate row-by-row undo, and doesn't fragment what's left behind. A purge that took hours takes seconds, and it takes the same few seconds a year from now.

Queries get faster for free. Nearly every query against this kind of data is bounded by time. With range partitioning, Oracle prunes irrelevant partitions before reading anything — so a query covering last week touches last week's partitions instead of scanning years of history.

Maintenance becomes bounded. Statistics gathering, compression and archival all operate on one partition at a time rather than one enormous object.

Interval partitioning is worth using here: Oracle creates each new partition automatically as data arrives, so nobody has to remember to pre-create next quarter's.

The decisions that actually matter

Local vs. global indexes. This is the one that catches people. A global index spans all partitions, so dropping a partition invalidates it unless you maintain it during the operation — which reintroduces exactly the cost you were trying to eliminate. Local indexes are partitioned alongside the table and drop cleanly with it. Where your access patterns allow local indexes, use them; where a global index is genuinely required, plan for its maintenance deliberately rather than discovering it during a failed purge.

Partition granularity. Too coarse and you can't purge at the resolution your retention policy requires, and pruning is less selective. Too fine and you accumulate enormous numbers of partitions with their own metadata overhead. Retention policy and query patterns should drive this, not intuition.

Automation. Partition management has to be a scheduled, monitored job — adding partitions ahead of need and dropping expired ones on schedule. When this runs silently for years, it must fail loudly when it fails at all. An unnoticed failure means either a full tablespace or a retention-policy breach, and you'd rather learn about it from an alert than from an outage.

Getting there on a live system

The hard part usually isn't the design — it's that the table is already large, already in production, and the application can't stop.

Oracle provides the tools for this: online redefinition, and on modern releases the ability to convert a non-partitioned table to a partitioned one online. Both let the conversion happen while the application keeps reading and writing. But "online" doesn't mean "unplanned." These operations need space, they need a window where they can run without competing for the same I/O as peak traffic, and they need a rehearsed rollback. Conversions of very large tables are best done in stages, validated at each step.

The payoff is worth the care. Systems that were straining under their own retention become predictable — purges that finish in seconds, queries that scale with the time range requested rather than the table size, and a maintenance profile that stays flat as the data keeps growing.


RhinoSource has designed Oracle partitioning architectures on RAC and Exadata for always-on IoT platforms serving millions of subscribers, including the online conversion of live production systems. If your purge window is closing, let's talk.

This is what we do

You run mission-critical Oracle at IoT scale and it cannot go down — through upgrades, failovers or growth.

Oracle at RhinoSource