目次
【MyBatis】大量データを一括更新する
MyBatisで大量データを一括で更新する方法を紹介します。
使用するDBMS(データベース管理システム)により一括更新の方法が異なるため、本記事では「Oracle」「PostgreSQL」「SQL Server」「MySQL」それぞれの方法を紹介します。
※今回の例では、下記のUPDATE文を一括更新しています。
[通常のUPDATE文]
<!-- 更新 --> <update id="update"> UPDATE userinfo SET name = #{name} ,address = #{address} ,phone = #{phone} ,update_date = CURRENT_TIMESTAMP WHERE id = #{id} </update>
スポンサーリンク
「PostgreSQL」と「SQL Server」で一括更新する方法
MyBatisを利用してPostgreSQLとQL Serverで一括更新する方法は次のとおり。
<!-- 一括更新 --> <update id="bulkUpdate"> <foreach collection="userList" item="item" separator=";"> UPDATE userinfo SET name = #{item.name} ,address = #{item.address} ,phone = #{item.phone} ,update_date = CURRENT_TIMESTAMP WHERE id = #{item.id} </foreach> </update>
「Oracle」で一括更新する方法
MyBatisを利用してOracleで一括更新する方法は次のとおり。Oracleの場合は、「BEGIN」と「;END;」が必要です。
<!-- 一括更新 --> <update id="bulkUpdate"> BEGIN <foreach collection="userList" item="item" separator=";"> UPDATE userinfo SET name = #{item.name} ,address = #{item.address} ,phone = #{item.phone} ,update_date = CURRENT_TIMESTAMP WHERE id = #{item.id} </foreach> ;END; </update>
「MySQL」で一括更新する方法
MyBatisを利用してMySQLで一括更新する方法は次のとおり。MySQLの場合は、ELT()とFIELD()を使用して複数のレコードをまとめて更新します。
<!-- 一括更新 --> <update id="bulkUpdate"> UPDATE userinfo SET name = ELT(FIELD(id, <foreach collection="userList" item="item" separator=","> #{item.id} </foreach> ), <foreach collection="userList" item="item" separator=","> #{item.name} </foreach> ) ,address = ELT(FIELD(id, <foreach collection="userList" item="item" separator=","> #{item.id} </foreach> ), <foreach collection="userList" item="item" separator=","> #{item.address} </foreach> ) ,phone = ELT(FIELD(id, <foreach collection="userList" item="item" separator=","> #{item.id} </foreach> ), <foreach collection="userList" item="item" separator=","> #{item.phone} </foreach> ) ,update_date = CURRENT_TIMESTAMP WHERE id IN ( <foreach collection="userList" item="item" separator=","> #{item.id} </foreach> ) </update>
測定結果(MySQL)
「1件ずつ更新する」場合と「複数のレコードをまとめて更新」する場合で、どのくらいの差がでるのか測定してみました。
測定結果は次の表のとおり。今回の測定で使用したDBMSは「MySQL」、一括更新は1000件ずつまとめて更新しています。また測定で使用しているPCのメモリは8GBです。
更新方法 | 1万件 | 10万件 | 100万件 |
---|---|---|---|
1件ずつ更新 | 8秒 | 1分3秒 | 10分31秒 |
一括更新 (1000件ずつまとめて更新) | 2秒 | 22秒 | 3分17秒 |
測定した結果、1件ずつ更新するよりも複数のレコードをまとめて更新した方が圧倒的に早いという結果になりました。
helpful
この記事は役に立ちましたか?