30000 записей - ничто.Вы должны быть в состоянии выполнить полный экспорт / импорт базы данных такого размера менее чем за 4 секунды, поэтому что-то кажется неправильным:)
Если вы можете предоставить нам некоторую информацию о таблицах, их отношенияхи что касается вашего отчета, я уверен, что мы можем дать некоторые конкретные советы по улучшению ситуации.
Некоторые общие советы по отчетам о производительности: Не используйте ORM-инструментдля отчетов, если требования к отчетам не являются очень тривиальными (в этом случае это будет называться список, а не отчет)Перейти на ручной SQL с отношением.
Не слушайте фанатиков, которые запрещают вам использовать специфичные для поставщика расширения SQL.Вы заплатили (в денежном выражении или за потраченное время) за эту конкретную сумму. Используйте его в полном объеме!
Делайте как можно больше работы внутри базы данных.(При использовании расширений это становится намного проще).Базы данных созданы для поиска, сортировки и агрегирования данных, и они делают это очень хорошо.Таблица с 1 000 000 строк при среднем размере строки 200 байтов будет занимать менее 200 МБ.Предполагая, что дисковая подсистема может выдавать 50 Мбит / с, потребуется 4 секунды, чтобы выполнить SUM (значение) по всей таблице.Это теоретический верхний предел.Если вам нужно больше, вам нужно предварительно вычислить данные, чтобы рабочий набор стал меньше (в Google это «агрегат» и «сведение»).
Это потенциально означает написание более длинных и более сложных запросов.Длинный сложный SQL часто сбивает с толку оптимизатор, так что он предлагает неоптимальный план выполнения.Решение этого обычно требует большого опыта работы с конкретным продуктом DBMS.Наличие нормализованной базы данных с полной ссылочной целостностью и проверкой ограничений делает эту проблему менее распространенной.
Не выполнять запросы в цикле.Если для выполнения запроса требуется 1 мс, выполнение 1000 запросов не займет 1 секунду.Каждый вызов должен «платить» за сетевую задержку, сортировку / удаление данных, потенциальные проблемы с блокировкой, анализ, выборку и т. Д.
(обновлено)
Еслиожидаемое (и приемлемое) время выполнения составляет более секунды или около того, вы можете позволить себе искать некоторые значения и предоставлять их в виде литералов для помощи оптимизатору.Это можно использовать для удаления некоррелированных подзапросов и объединений.
Сохранение пользовательских функций на минимуме.Они сбивают с толку оптимизатор и часто вызывают обработку строк (которая не масштабируется).