約 600 万件のレコードを含むテーブルがあります。ID
Java で処理するには、各行の を取得する必要があります。これID
は英数字の nvarchar(8) です。これをメモリセーフで効率的な方法で行いたいと思います。
以下は私のアプローチです。その中で、上位 1000 レコードを選択します。それらを処理します。ID が最後のレコード セットの最大 ID より大きい次の 1000 レコードを選択します。1000 レコード未満のセットを取得するまで続行します。
私の戦略はメモリセーフな方法ですべてのレコードを取得すると信じていますが、より高速で優れた戦略があるかどうかはわかりません。(また、戦略がすべてのレコードを取得することも肯定的ではありません。より多くのリソースを備えた環境でテストする必要があります。私の環境は非常に不安定です)。
List<String> ids = myDao.getTopThousandIds();
processIds(ids);
while(skus.size() == 1000) {
ids = myDao.getTopThousandIdsGreaterThan(ids.get(ids.size() -1));
processIds(skus);
}
public interface MyDao {
@SqlQuery("SELECT TOP 1000 [ID] FROM [tbl] WITH(NOLOCK) ORDER BY [ID] ASC")
List<String> getTopThousandIds();
@SqlQuery("SELECT TOP 1000 [ID] FROM [tbl] WITH(NOLOCK) WHERE [ID] > :id ORDER BY [ID] ASC")
List<String> getTopThousandIdsGreaterThan(@Bind("id") String id);
}