2

友達、

各テーブルに最低 1 億レコードの注文テーブルがあります。1 日あたり少なくとも 50K (MIN) および 200K (MAX) のレコードを削除するストアド プロシージャを呼び出すジョブを実行しています。

現在、SQL BULK COLLECT を使用してテーブルからレコードを削除しています。現在、非常に遅い 50K の削除に 4 時間以上かかっています。

Googleで検索した後、CTASメソッドを見つけました。つまり、テーブルを作成し、必要なレコードを保持し、既存のレコードを削除して一時テーブルの名前を変更しました。テーブルがより重要であるため、このオプションが受け入れられなかったため、これを行うことはできません。

同じのパフォーマンスを改善するための解決策を提案してください。

前もって感謝します!!

4

2 に答える 2

1

データを複製するのに十分な物理ディスク容量があると仮定すると、次のアプローチを使用できます (テーブルは ORDERS と呼ばれると仮定します)。

  • 注文テーブルのコピー ORDER_B を作成しますCREATE TABLE orders_b AS SELECT * FROM orders
  • 元のテーブルの名前を ORDERS_A に変更します。ALTER TABLE orders RENAME TO orders_a
  • ORDERS_A を指す ORDERS というシノニムを作成します。CREATE SYNONYM orders FOR order_a

ここまでは順調ですね。クライアント コードは、物理テーブルの代わりにシノニム ORDERS を使用するようになりました。ここからは楽しい部分 (毎日のリフレッシュ ルーチン) です。

  • ORDERS_B を切り捨てる
  • ORDERS_B に入力しINSERT /*+APPEND+*/ます (PARALLEL ヒントも試してみてください)。
  • シノニム ORDERS を ORDERS_B を指すように切り替えます
  • 翌日: ORDERS_B の代わりに ORDERS_A で繰り返します
  • 無限に繰り返す

または、TRUNCATE/INSERT を使用する代わりに、テーブルを削除して再作成することもできます。インデックスと許可も再作成する必要があるため、これにはさらに多くの作業が必要です。

この手法はシノニム スイッチングと呼ばれます。より完全な説明を得るには、シノニム スイッチングに関する Tyler Muth の記事を参照してください。

于 2014-05-15T06:37:30.107 に答える