0

毎月 200 万行の txn テーブルがあり、ストアド プロシージャを使用してデータをロードしています。プロセス中に失敗し、再度ロードしていた場合は、次を使用してトランザクションを削除する必要があります。

Table TXN structure

TXN_ID    NUMBER primary key 
TXN_AMT   number
YEAR    varchar2
MONTH   varchar2

ここで一括収集を使用できますか? where 句で必要です

DELETE FROM TXN WHERE YEAR=cYear and Month=cMonth 

どうすれば速くなるかアドバイスください

4

2 に答える 2

1

「プロセス中にトランザクションが失敗し、再度ロードしていた場合は、以下を使用してトランザクションを削除する必要があります。」

あなたの実際の問題はロードプロセスにあるようです。ロード全体を 1 つの作業単位として定義する必要があります。つまり、2000000 行の最後に 1 つのコミットがあります。その後、障害が発生した場合に何も削除する必要はありません。

現時点では、明らかに断続的なコミットがあります。これを行う必要があると考えるいくつかの理由のいずれかがあるかもしれませんが、それらはすべて偽物です。DBA に UNDO テーブルスペースのサイズを設定してもらうだけで、データ ボリュームに適したサイズになります。または、どの行がロードされた (つまり、コミットされた) かを識別できるように、ロード プロセスを書き直す必要があります。障害が発生した場合は、残りをロードするだけです。


削除プロセスを高速化する限り、多くのオプションはありません。FORALL 処理は高速ではありません。PL/SQL はオーバーヘッドが発生するため、単純な DELETE よりも安価ではありません。10 年分のデータを含むテーブルがない限り、(YEAR,MONTH) のインデックスは役に立ちません。

Enterprise Edition と多数の CPU を使用している場合は、PARALLEL DML を使用して、より短い経過時間で削除を実行できます。

ただし、チューニングの問題と同様に、ステートメントの現在の実行パスを理解する必要があります。これは、Explain Plan から開始することを意味します。それらは SELECT だけのものではありません。

于 2012-10-03T07:36:41.223 に答える
0

別のアプローチとして、データベースの月と年を削除しているため

  • テーブルに月ごとのパーティションを作成し、不要な場合は特定の月のパーティションを削除できます。(ALTER TABLE TABLENAME DROP PARTITION PARTION_NAME)
  • 同様に、ロードが失敗した場合は、その月のパーティションのみを切り捨てて、再度ロードしてください。
  • さらに、事前定義された条件でパーティションを削除できるPL / SQLジョブを作成できます。たとえば、2012年12月1日にDROP PARTION_DEC_2011を作成します。また、新しいデータのロードに使用する2か月前にパーティションを追加します。
于 2012-10-03T06:15:25.780 に答える