sql >> Databasteknik >  >> RDS >> Oracle

Snabbaste sättet att uppdatera ett stort antal rader med indataparam List i MyBatis till Oracle db

Att använda batch executor är det rekommenderade sättet, men du måste göra det ordentligt.
Två problem som jag märkte.

  1. Det är viktigt att ställa in en korrekt batchstorlek. Det länkade svaret skickar all data i slutet, vilket inte är särskilt effektivt.
  2. Med ${} till referensparametrar gör varje sats unik och förhindrar föraren från att återanvända satsen (fördelen med batch executor går i princip förlorad). Se denna FAQ för skillnaden mellan #{} och ${} .

Här är en typisk batchoperation med MyBatis.
Som bästa batchSize beror på olika faktorer bör du mäta prestandan med hjälp av faktiska data.

int batchSize = 1000;
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
  YourMapper mapper = sqlSession.getMapper(YourMapper.class);
  int size = list.size();
  for (int i = 0; i < size;) {
    mapper.update(list.get(i));
    i++;
    if (i % batchSize == 0 || i == size) {
      sqlSession.flushStatements();
      sqlSession.clearCache();
    }
  }
  sqlSession.commit();
}

Och här är en effektiv version av uppdateringsförklaringen.

<update id="update">
  UPDATE <include refid="tableName" />
  SET
    item_price = #{item.price},
    update_time = #{item.updateTime}
  WHERE id = #{item.id}
</update>



  1. MySQL MATCH fungerar inte med två karaktärer?

  2. Spark SQL och MySQL- SaveMode.Skriv över utan att infoga modifierade data

  3. Hur fuzzy matchar e-post eller telefon av Elasticsearch?

  4. Hur överför man data från AWS Postgres RDS till S3 (sedan rödskiftning)?