![](/img/trans.png)
[英]deleting 800 million orphan records from a table containing 1.5 billion records in oracle
[英]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 ALTER TABLE orders RENAME TO orders_a
重命名為ALTER TABLE orders RENAME TO orders_a
CREATE SYNONYM orders FOR order_a
到現在為止還挺好。 您的客戶端代碼現在使用同義詞ORDERS而不是物理表。 現在來了有趣的部分(每日刷新例程):
INSERT /*+APPEND+*/
填充ORDERS_B(您可能還想嘗試PARALLEL提示) 或者,可以使用刪除表並重新創建的方法來代替使用TRUNCATE / INSERT。 這需要更多的工作,因為您還必須重新創建索引和授權。
這項技術稱為同義詞切換-您可能需要閱讀Tyler Muth的有關同義詞切換的文章,以獲得更完整的解釋。
刪除記錄的條件是什么?
也許您可以在此表上創建基於函數的索引。 然后,您可以使用一個簡單的delete語句刪除記錄。 或考慮表分區。 如果您的分區鍵很靈巧並且涵蓋了刪除條件,則可以在幾秒鍾內刪除或清除舊分區。
順便說一句,與包DBMS_REDEFINITION
你可以改變一個“正常”表一表partitized甚至無需中斷服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.