Вам нужно иметь все записи в памяти для их форматирования? Вы можете попытаться выполнить потоковую передачу записей через процесс и прямо в файл. Если вам удастся еще больше разбить запрос, возможно, вы сможете начать обработку результатов, пока вы все еще их извлекаете.
В зависимости от вашей базы данных БД у них могут быть такие инструменты, как SSIS для Sql Server 2005+.
Редактировать
Я разработчик .net, поэтому позвольте мне предложить то, что я буду делать в .net, и, надеюсь, вы сможете конвертировать в сопоставимые технологии на стороне Java.
ADO.Net имеет DataReader, который является только перенаправленным, только для чтения (Firehose) курсором набора результатов. Он возвращает данные во время выполнения запроса. Это очень важно. По сути, моя логика будет:
IDataReader reader=GetTheDataReader(dayOfWeek);
while (reader.Read())
{
file.Write(formatRow(reader));
}
Поскольку это выполняется, когда мы возвращаем строки, вы не собираетесь блокировать доступ к сети, что, я полагаю, является для вас огромным узким местом. Ключевым моментом здесь является то, что мы долго не храним ничего в памяти, поскольку мы циклически повторяем, читатель отбрасывает результаты, а файл записывает строку на диск.