В конечном счете, лучшее, что нужно сделать, - это измерить и найти источник ваших узких мест. Выясните, какие запросы в хранимой процедуре или какие операции в вашем коде занимают больше всего времени, и в первую очередь сосредоточьтесь на их уменьшении.
Сейчас я работаю над аналогичной проблемой, над заданием, которое выполняет сложную бизнес-логику в Java для большого количества записей базы данных. Я обнаружил, что ключ в том, чтобы обрабатывать записи в пакетах и заставлять как можно больше логики работать с пакетами, а не с одной записью. Это минимизирует количество обращений к базе данных и делает некоторые запросы гораздо более эффективными, чем когда я запускаю их для одной записи за раз. Ограничение размера пакета не позволяет серверу исчерпать память при работе на стороне Java. Поскольку я использую Hibernate, я также вызываю session.clear () после каждого пакета, чтобы предотвратить сохранение в сеансе копий объектов, которые мне больше не нужны из предыдущих пакетов.
Кроме того, СУБД оптимизирована для работы с большими наборами данных; по возможности используйте обычные операции SQL. Избегайте таких вещей, как курсоры и много процедурного программирования; как уже говорили другие, убедитесь, что ваши индексы настроены правильно.