Oracle
 sql >> база данни >  >> RDS >> Oracle

Най-бързият начин за актуализиране на огромен брой редове с входен параметър List в MyBatis към Oracle db

Използването на пакетен изпълнител е препоръчителният начин, но трябва да го направите правилно.
Два проблема, които забелязах.

  1. Задаването на подходящ размер на партидата е важно. свързаният отговор изпраща всички данни в края, което не е много ефективно.
  2. Използване на ${} за препращане към параметри прави всеки оператор уникален и не позволява на драйвера да използва повторно израза (ползбата от груповия изпълнител се губи, основно). Вижте този ЧЗВ за разликата между #{} и ${} .

Ето типична групова операция с помощта на MyBatis.
Като най-добрият batchSize зависи от различни фактори, трябва да измервате ефективността, като използвате действителните данни.

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

Ето една ефективна версия на изявлението за актуализиране.

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да компресирам този набор от резултати на Oracle в стойности според приоритета на реда, игнорирайки нули?

  2. Как да умножаваме стойности с помощта на SQL

  3. Защо получавам отворена транзакция, когато просто избирам от изглед на база данни?

  4. Как да експортирате резултатите от заявката в .txt файл, когато използвате SQLcl (Oracle)

  5. Oracle обръща редове към колони