sql >> データベース >  >> RDS >> Oracle

MyBatisの入力パラメータListを使用して膨大な数の行をOracleデータベースに更新する最速の方法

    バッチエグゼキュータを使用することをお勧めしますが、適切に行う必要があります。
    私が気付いた2つの問題。

    1. 適切なバッチサイズを設定することが重要です。 リンクされた回答 最後にすべてのデータを送信しますが、これはあまり効率的ではありません。
    2. ${}の使用 パラメータを参照すると、各ステートメントが一意になり、ドライバがステートメントを再利用できなくなります(基本的に、バッチエグゼキュータの利点は失われます)。 このFAQ #{}の違いについて および${}

    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. 2038年問題とは何ですか?

    2. 同じ列を持つ2つのテーブルを比較して結果を取得します

    3. PHPセッション+MySQLリソース

    4. PostgreSQLRAISEコマンドを動的に実行する方法