「プロセス中にトランザクションが失敗し、再度ロードしていた場合は、以下を使用してトランザクションを削除する必要があります。」
あなたの実際の問題はロードプロセスにあるようです。ロード全体を 1 つの作業単位として定義する必要があります。つまり、2000000 行の最後に 1 つのコミットがあります。その後、障害が発生した場合に何も削除する必要はありません。
現時点では、明らかに断続的なコミットがあります。これを行う必要があると考えるいくつかの理由のいずれかがあるかもしれませんが、それらはすべて偽物です。DBA に UNDO テーブルスペースのサイズを設定してもらうだけで、データ ボリュームに適したサイズになります。または、どの行がロードされた (つまり、コミットされた) かを識別できるように、ロード プロセスを書き直す必要があります。障害が発生した場合は、残りをロードするだけです。
削除プロセスを高速化する限り、多くのオプションはありません。FORALL 処理は高速ではありません。PL/SQL はオーバーヘッドが発生するため、単純な DELETE よりも安価ではありません。10 年分のデータを含むテーブルがない限り、(YEAR,MONTH) のインデックスは役に立ちません。
Enterprise Edition と多数の CPU を使用している場合は、PARALLEL DML を使用して、より短い経過時間で削除を実行できます。
ただし、チューニングの問題と同様に、ステートメントの現在の実行パスを理解する必要があります。これは、Explain Plan から開始することを意味します。それらは SELECT だけのものではありません。