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
}
}
感謝nop,所以我們優化應用程序的刪除操作性能的唯一方法是通過改變SQL條件本身嗎? – dimas
不完全。我所建議的是,不是通過DELETE刪除大量行,而是使用類似「DWH」的方法,並將互補行(通過直接加載!)插入到不同的表中,然後交換兩個表(通過分區交換)。 但是,通常,最終的解決方案是,真的,非常依賴數額是多少,我們正在談論的數據,改變了你有什麼做表組織的選擇,等等,等等:-(的 – nop77svk
此外,對於特定的樣本查詢你發佈在你的問題上... 嘗試在'TBL_B(BD,ID)'和'TBL_A(ID)'上創建索引,如果你還沒有這些索引,並且有'TBL_A'和'TBL_B'重新計算,這可能有助於潛在次優的查詢執行計劃 唉,不知道你的應用程序,所有正在使用的執行計劃,你的表結構和數據量我不能建議你的性能問題的解決方案(S)。 – nop77svk