более 3 миллионов записей - это слишком много для одновременной обработки. Я предполагаю, что вы выполняете экспорт или что-то в этом роде, которое требует отправки большого количества записей по сети. Один из методов, который вы могли бы использовать, чтобы уменьшить эту проблему, состоял бы в том, чтобы средний уровень генерировал файл экспорта, а затем доставлял этот файл клиенту (предпочтительно сначала сжимая с использованием ZLIB или чего-то подобного).
Если вы извлекаете данные обратно клиенту для просмотра, рассмотрите возможность отправки только сводной информации, а затем разрешите клиенту копать данные по частям за раз. Пользователи будут благодарны вам, потому что ваша производительность будет расти, и им не придется копаться в записях, которые им не нужны.
EDIT
Даже 300 000 записей - это слишком много для одновременной обработки. Если бы у вас было столько копеек, вы бы смогли нести их все? Но если бы ты превратил это в более крупные деноминации, ты мог бы. если вы отправляете данные клиенту для отчета, то я настоятельно рекомендую метод сводки ... предоставьте им общую картину и позвольте им медленно углубляться в данные. отправьте сгруппированные данные, а затем медленно открывайте их.
Если это экран результатов поиска, установите ограничение на количество возвращаемых записей + 1. Например, для отображения 100 записей установите ограничение на 101. По-прежнему отображается только 100, последняя запись означает, что было более 100 записей, поэтому клиенту необходимо настроить критерии поиска для получения меньшего подмножества.