优化hibernate删除操作

时间:2014-06-23 00:20:24

标签: java hibernate java-ee oracle11g

下面的代码有效,但当SQL删除超过一百万行时会出现性能问题。 2小时表需要很长时间才能删除大约1小时。我们无法控制传递给我们的sql条件。有没有更好的方法让这种运行更快?

除此之外,我们没有DB管理员权限,因此存储过程无法成为解决方案。任何帮助是极大的赞赏。感谢

示例SQL QUERY

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

删除方法

 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 个答案:

答案 0 :(得分:1)

这个特定的“问题”没有更快的方法。不幸的是,这不是性能问题,而是应用程序设计问题。

......但是......

你可以:

  1. 使用单个分区和一组与原始表相同的索引创建表的列表分区副本。
  2. insert /*+ append */ into the replica select * from the original表与NOT的{​​{1}}一起使用。
  3. 将单个副本分区与原始表交换。
  4. CONDITION具有Truncate选项的单个副本分区。
  5. 更具体的答案需要更具体的问题。