Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Najszybszy sposób na aktualizację dużej liczby wierszy z parametrem wejściowym List w MyBatis do Oracle db

Zalecanym sposobem jest użycie executora wsadowego, ale musisz to zrobić poprawnie.
Zauważyłem dwa problemy.

  1. Ważne jest ustawienie odpowiedniej wielkości partii. odpowiedź połączona wysyła wszystkie dane na końcu, co nie jest zbyt wydajne.
  2. Korzystanie z ${} to reference parameters sprawia, że ​​każda instrukcja jest unikatowa i uniemożliwia sterownikowi ponowne użycie instrukcji (w zasadzie korzyść z wykonywania wsadowego jest tracona). Zobacz to najczęściej zadawane pytania dla różnicy między #{} i ${} .

Oto typowa operacja wsadowa przy użyciu MyBatis.
Jako najlepszy batchSize zależy od różnych czynników, powinieneś zmierzyć wydajność przy użyciu rzeczywistych danych.

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 oto wydajna wersja oświadczenia o aktualizacji.

<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. Jak przekonwertować format liczbowy kolumny obliczeniowej na format czasu (gg:mm:ss), zapytanie sql

  2. Czy można tworzyć typy obiektów Oracle Database w PL/SQL?

  3. Jak utworzyć nie zerowe ograniczenie w Oracle?

  4. Wygeneruj plik XML z niestandardowymi tagami XML z tabeli bazy danych Oracle

  5. Podziel duży plik tekstowy/CSV na wiele plików w PL SQL