2014-06-23 56 views
1

以下代碼正常工作,但在SQL刪除超過一百萬行時會出現性能問題。 2M桌子需要很長時間才能被刪除大約1小時。我們無法控制傳遞給我們的sql條件。有沒有更好的方法讓這個運行更快?優化休眠刪除操作

除此之外,我們沒有DB管理員訪問權限,因此存儲過程不能成爲解決方案。任何幫助是極大的讚賞。由於

樣本SQL查詢

DELETE TBL_A WHERE ID IN (SELECT ID FROM TBL_B WHERE 1=1 AND TBL_B.BD < TO_DATE(ADD_MONTHS(SYSDATE, -240))); 

DELETE方法

public void deleteRows(String table, String condition){ 

    StringBuilder sql = new StringBuilder(); 
    sql.append("DELETE TABLE=:TABLE WHERE CONDITION=:CONDITION "); 

    try{ 
    transaction = session.beginTransaction(); 

    int rows = session.createSQLQuery(sql.toString()).setParamater("TABLE",TABLE).setParameter("CONDITION",CONDITION).executeUpdate(); 

    transaction.commit(); 
    } 
    catch{ 
    //logic here 
    } 
    } 

回答

1

有這個特定的 「問題」 沒有更快的方法。不幸的是,這不是一個性能問題,它是一個應用程序設計問題。

...但是...

您可以:

  1. 只有一個分區和一組指標等同於原始表的創建表的列表分區副本。
  2. 使用insert /*+ append */ into the replica select * from the original表與CONDITIONNOT
  3. 用原始表交換單個副本分區。
  4. Truncate具有drop storage選項的單個副本分區。

更具體的答案需要一個更具體的問題。

+0

感謝nop,所以我們優化應用程序的刪除操作性能的唯一方法是通過改變SQL條件本身嗎? – dimas

+0

不完全。我所建議的是,不是通過DELETE刪除大量行,而是使用類似「DWH」的方法,並將互補行(通過直接加載!)插入到不同的表中,然後交換兩個表(通過分區交換)。 但是,通常,最終的解決方案是,真的,非常依賴數額是多少,我們正在談論的數據,改變了你有什麼做表組織的選擇,等等,等等:-(的 – nop77svk

+0

此外,對於特定的樣本查詢你發佈在你的問題上... 嘗試在'TBL_B(BD,ID)'和'TBL_A(ID)'上創建索引,如果你還沒有這些索引,並且有'TBL_A'和'TBL_B'重新計算,這可能有助於潛在次優的查詢執行計劃 唉,不知道你的應用程序,所有正在使用的執行計劃,你的表結構和數據量我不能建議你的性能問題的解決方案(S)。 – nop77svk