8

日付範囲別にレポートを返すクエリがあります。日付範囲が大きい場合、50,000 行が返されることがあります。日付範囲が非常に小さい場合、10 件のレコードが返される可能性があります。フェッチ サイズを 1000 に設定すると、5 万行が返されるときに実行時間が大幅に短縮されることがわかりました。ただし、10 行が返されたときに 1000 に設定すると、速度が低下し、過剰なメモリが消費されます。これはほんの一例です。さまざまな条件 (実行中のジョブの種類など) に基づいて、少数または多数の行を返す多くのクエリがあります。

理想的には、クエリが実行された後 (ただし、行が返される前) にこれが自動設定されると便利です。

これを行うより良い方法はありますか?

私は org.springframework.jdbc.core.support.JdbcDaoSupport.SimpleJdbcDaoSupport getJdbcTemplate().setFetchSize(1000); を使用しています。

4

3 に答える 3

0

解決策を見つけました。フェッチ サイズはいつでも (行の取得中でも) 変更できることがわかりました。私の最初の実装では、フェッチ サイズをデフォルトで 1 に設定しました。2 行目が表示されたときに、それを 10 に変更しました。11 行目が表示されたときに、それを 100 に変更しました。ローカル データベースとリモート データベースを使用していくつかのパフォーマンス テストを実行し、以下について。(Spring JDBC は行マッパーを使用します。これが org.springframework.jdbc.RowMapper の実装方法です)。

public T mapRow(ResultSet rs, int index) {
    T dto = null;

    if (index == 0) {
        setFetchSize(rs, 50);
    } else if (index == 50) {
        setFetchSize(rs, 500);
    } else if (index == 1000) {
        setFetchSize(rs, 1000);
    }

    try {
        dto = mapRowToDto(rs, index);
    } catch (SQLException e) {
        throw new RuntimeException(e.getMessage(), e);
    }

    return dto;
}
于 2013-08-23T13:12:36.880 に答える