繁体   English   中英

一次合并到多个语句中Oracle SQL

[英]MERGE INTO multiple statements at once Oracle SQL

我有一个合并成这样的声明:

   private static final String UPSERT_STATEMENT = "MERGE INTO " + TABLE_NAME + " tbl1 " +
    "USING (SELECT ? as KEY,? as DATA,? as LAST_MODIFIED_DATE FROM dual) tbl2 " +
    "ON (tbl1.KEY= tbl2.KEY) " +
    "WHEN MATCHED THEN UPDATE SET DATA = tbl2.DATA, LAST_MODIFIED_DATE = tbl2.LAST_MODIFIED_DATE " +
    "WHEN NOT MATCHED THEN " +
    "INSERT (DETAILS,KEY, DATA, CREATION_DATE, LAST_MODIFIED_DATE) " +
    "VALUES (SEQ.NEXTVAL,tbl2.KEY, tbl2.DATA, tbl2.LAST_MODIFIED_DATE,tbl2.LAST_MODIFIED_DATE)";

这是执行方法:

 public void mergeInto(final JavaRDD<Tuple2<Long, String>> rows) {
    if (rows != null && !rows.isEmpty()) {
        rows.foreachPartition((Iterator<Tuple2<Long, String>> iterator) -> {

            JdbcTemplate jdbcTemplate = jdbcTemplateFactory.getJdbcTemplate();
            LobCreator lobCreator = new DefaultLobHandler().getLobCreator();

            while (iterator.hasNext()) {
                Tuple2<Long, String> row = iterator.next();
                String details = row._2();
                Long key = row._1();

                java.sql.Date lastModifiedDate = Date.valueOf(LocalDate.now());
                Boolean isSuccess = jdbcTemplate.execute(UPSERT_STATEMENT, (PreparedStatementCallback<Boolean>) ps -> {

                    ps.setLong(1, key);
                    lobCreator.setBlobAsBytes(ps, 2, details.getBytes());
                    ps.setObject(3, lastModifiedDate);
                    return ps.execute();
                });
                System.out.println(row + "_" + isSuccess);

            }
        });
    }
}

我需要在PLSQL中向上插入该语句的多个,如果可能的话,批量增加10K。

  1. 节省时间的有效方法是:一次执行10K语句,还是在同一事务中执行10K语句?
  2. 我应该如何更改支持方法?

谢谢,我

  1. 最有效的方法是将数据批量加载到数据库中。 与一对一的上传相比(如您的示例),我希望性能至少提高1或2个数量级(“更大”的数据意味着通过批量插入获得的数据更少)。

  2. 您可以使用此答案中描述的技术,先将记录批量插入到临时表中,然后使用该临时表执行单个合并语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM