簡體   English   中英

刪除表中的記錄在Oracle中包含1.8億

[英]Deleting records in table contains 180 Million in oracle

朋友們,

我有訂單表,每個表中至少有1億條記錄。 我們有一個正在運行的作業,它調用一個存儲過程,該存儲過程每天刪除至少50K(MIN)和200K(MAX)記錄。

我目前正在使用SQL BULK COLLECT從表中刪除記錄。 目前,刪除50K耗時超過4個小時,這實在太慢了。

在google中搜索后,找出CTAS方法,即創建表並保留我們想要的記錄,並刪除現有記錄並重命名temp表。 我不能執行此操作,因為此表更為重要,因此無法接受此選項。

您能否提出一些解決方案以提高其性能?

提前致謝!!

假設您有足夠的物理磁盤空間來復制數據,則可以使用以下方法(我假設您的表稱為ORDERS):

  • 使用CREATE TABLE orders_b AS SELECT * FROM orders訂單表的副本ORDER_B
  • 將您的原始表重命名為ORDERS_A: ALTER TABLE orders RENAME TO orders_a重命名為ALTER TABLE orders RENAME TO orders_a
  • 創建一個名為ORDERS的同義詞,該同義詞指向ORDERS_A:為order_a CREATE SYNONYM orders FOR order_a

到現在為止還挺好。 您的客戶端代碼現在使用同義詞ORDERS而不是物理表。 現在來了有趣的部分(每日刷新例程):

  • 截斷ORDERS_B
  • INSERT /*+APPEND+*/填充ORDERS_B(您可能還想嘗試PARALLEL提示)
  • 切換同義詞ORDERS以指向ORDERS_B
  • 第二天:重復ORDERS_A而不是ORDERS_B
  • 無限重復廣告

或者,可以使用刪除表並重新創建的方法來代替使用TRUNCATE / INSERT。 這需要更多的工作,因為您還必須重新創建索引和授權。

這項技術稱為同義詞切換-您可能需要閱讀Tyler Muth的有關同義詞切換的文章,以獲得更完整的解釋。

刪除記錄的條件是什么?

也許您可以在此表上創建基於函數的索引。 然后,您可以使用一個簡單的delete語句刪除記錄。 或考慮表分區。 如果您的分區鍵很靈巧並且涵蓋了刪除條件,則可以在幾秒鍾內刪除或清除舊分區。

順便說一句,與包DBMS_REDEFINITION你可以改變一個“正常”表一表partitized甚至無需中斷服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM