2011-10-25 69 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 

所以實際上它`6.3M + 6.3M + 1.2M + 1行被刪除

Here`s約束的pool_id的完成:

  • 沒有分區
  • Oracle版本9
  • 網上所有的時間,所以無需停機既不CTAS
  • 我們不能使用級聯約束
  • 正常化是非常重要的

Here`s我的嘗試:

  • 批量刪除
  • with語句刪除(在和存在條款)
  • 每個級別和1級加入的臨時表
  • pro cedure和承諾每個20k

沒有那些在一個體面的時間框架內工作,如少於一個小時。我們無法基於某一列值刪除這一事實並不有幫助。有沒有辦法?

+3

它花了一個小時怎麼了?這是你想要常規做的事嗎? – derobert

+0

同意。假設您試圖從'table_1'中的單個記錄中刪除'table_4'中的記錄,我希望這會花費一些時間(即使有正確的標記,也是_long_)。請注意,如果優化器可以使用不同的/額外的索引,例如,如果您已經知道所有行在某個任意值之前都有(記錄的)創建日期,那麼向'WHERE'子句添加附加條件可以加快刪除速度,或者以「A」開頭的文本或其他內容。你可能不需要承諾控制在這裏... –

+0

桌子有多大?即。是大部分記錄還是小部分? –

回答

1

如果您試圖刪除連接表,複雜性可能會變成立方體或甚至更糟。隨着表有很多記錄,這將成爲一個性能殺手。您可以嘗試從臨時表的第一個表格輸出要刪除的值列表,然後使用另一個表格從第二個表格中選擇要刪除的ID等等。我認爲有適當的指標會保持複雜性的二次方,並在正常的時間段完成任務。祝你好運

+0

您是否嘗試在刪除操作之前禁用外鍵約束,並在其後再次啓用它們。它有時工作... –