Truncate partition should be "instant", so if this 20+ minutes something's up.
From 12.1 maintenance of any global indexes is deferred to a background job. But there are restrictions on this feature, so if the table has global indexes and you use the UPDATE INDEXES clause this may explain the wait.
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/vldbg/maintenance-partition-can-be-performed.html#GUID-087B87A6-959A-40C6-82AF-36E401FD089B If this isn't the problem, you may be hitting a bug; various support notes mention partition maintenance operations taking a long time. Check with support - though note 12.2 is out of support now, so you may need to prioritise upgrading.
If we delete all rows in the partition we want to truncate (yes, this will generate A LOT of redo) and truncate after the partition is empty, will this likely help?Maybe? We'd need to know why the truncate is slow to answer that. Tracing the session that is truncating the partition will help us see what exactly this operation is doing.
Is there a way to generate less redo and/or improve the deletion speed of such a large number of rows (600 million)?You can do a filtered partition move from 12.2. This only keeps the rows where the condition is true. So something like:
alter table ... move partition ...
including rows where 1=0
online
will delete all the rows in the partition. As you're moving nothing this should be fast. Though this may hit the same problem as truncate.
How are situations like this handled for zero-downtime applications?Like I said at the top, this should be a fast operation. If it's not, something's wrong.