2011-10-25 28 views
1

削除に無限ループが発生しました。私はこの問題に対処するために多くの方法を試しましたが、まだ時間がかかります。私は可能な限り明確にしようとします。パーティション分割なしで大規模な削除(2回の結合が必要)

私はこの問題に4つの関係テーブルを持っています。

欠失は

Table 1 contain the pool_id 
Table 2 the ticket_id foreign join ticket_pool_id with the pool_id 
Table 3 ticket_child_id foreign join ticket_id with the ticket_id 
Table 4 ticket_grand_child_id foreign ticket_child_id join with the ticket_child_id 

Concerned count for each 
table 1---->1 
table 2---->1 200 000 
table 3---->6 300 000 
table 4---->6 300 000 

したがって、実際にそれ `sは、6.3M + 6.3M + 1.2M + 1行削除する

Here`s制約所与POOL_IDに依存して行われます。そう

  • ないパーティション
  • Oracleバージョン9
  • オンラインすべての時間ダウンタイムもないCTAS
  • 我々が使用することはできませんカスケード制約が
  • 正規化は非常に重要ではありません

Here`s私が試した何:

  • バルク(
  • は声明で削除では削除し、存在する句)
  • 各レベルと1レベル参加の一時テーブル
  • pro交代してコミットする20k

1時間以下のような適切な時間枠で働いた人はいません。列の値の1つに基づいて削除を行うことができないという事実は、役に立たない。方法はありますか?

+3

何時間もかかりましたか?これはあなたが日常的にやっていることですか? – derobert

+0

合意。あなたが 'table_1'の単一レコードに基づいて' table_4'からレコードを削除しようとしているのを見て、これはしばらく時間がかかると思います。オプティマイザが別の/追加のインデックスを使用できる場合、たとえばWHERE句に条件を追加すると削除速度が向上することに注意してください。たとえば、すべての行に任意の値の前に(記録された) 、または "A"などで始まるテキストを含んでいてもかまいません。あなたはここでコミットメントコントロールを必要としないかもしれません... –

+0

テーブルの大きさはどれくらいですか?すなわち、 6.3Mレコードの大部分か小さい部分ですか? –

答えて

1

テーブルへの参加を削除しようとすると、複雑さがさらに複雑になり、さらに悪化する可能性があります。多くのレコードを持つテーブルでは、これはパフォーマンスのキラーになるでしょう。テンポラリテーブルの最初のテーブルから削除する値のリストを出力し、別のテーブルを使用して2番目のテーブルから削除するIDを選択するなどの操作を実行できます。私は、適切なインデックスを持つことで複雑さを二次的に保ち、通常の時間内にタスクを完了させると思います。幸運

+0

削除操作の前に外部キー制約を無効にしてから、再度有効にしてみましたか?それは時々動く... –

関連する問題