sql >> Databáze >  >> RDS >> Oracle

Nejrychlejší způsob aktualizace velkého počtu řádků pomocí vstupního parametru List v MyBatis na Oracle db

Použití dávkového spouštěče je doporučený způsob, ale musíte to udělat správně.
Všiml jsem si dvou problémů.

  1. Nastavení správné velikosti dávky je důležité. propojená odpověď odešle všechna data na konci, což není příliš efektivní.
  2. Pomocí ${} odkazovat na parametry činí každý příkaz jedinečným a zabraňuje ovladači v opětovném použití příkazu (v podstatě se ztrácí výhoda dávkového spouštěče). Viz tyto nejčastější dotazy pro rozdíl mezi #{} a ${} .

Zde je typická dávková operace pomocí MyBatis.
Jako nejlepší batchSize závisí na různých faktorech, měli byste měřit výkon pomocí skutečných dat.

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();
}

A zde je efektivní verze prohlášení o aktualizaci.

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



  1. Použití sloupce v SQL join bez jeho přidání do skupiny podle klauzule

  2. Neshoda mezi hodnotami DATETIME v databázích H2 a MySQL vložených z Java/Kotlin

  3. Jak ATAN() funguje v MariaDB

  4. randomizace velkého souboru dat