データ移行PJTの中に、大量データ取得sqlのパフォーマンスがすごく悪くて、対策などをメモしておきます。
背景
移行元データ量は数千万が存在して、全量データを一発で取得するのはかなり時間がかかります。
対策としては、limit offsetを利用して、単位件数で取得していきました。
select * from table limit 10000 offset 0;
が、offsetは大きくなると、実施時間が長くなり、落ちることも発生しました。
対策
1. 取得結果のreturn listはListからCursorに変更する。
import org.apache.ibatis.cursor.Cursor;
2. select sqlにfetchSizeを追加する。
サンプルソース:
testMapper.java
package com.xxx.xxx.xxx.xxx.test;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.cursor.Cursor;
@Mapper
public interface TestMapper{
Cursor<testDto> selectAll();
}
testMapper.xml
<select id="selectAll" fetchSize="10000" restultType="com.xxx.xxx.xxx.xxx.test.testDto">
select * from testTable
where a = ''
</select>
以上