Какие есть идеи для выполнения очень большого запроса?
Есть запрос базу данных, берется 40 полей, из разных таблиц ( 9 join-ов) в запросе используется один коротенький подзапрос и оконные функции lead, в основной таблице, по которой работает запрос 5 млн. записей, пытался создать представление, но при обращении к нему 504 error, такая же ситуации и с созданием функции, где используется курсор, может есть какие нибудь способы выполнить очень большой и трудоемкий запрос укладываясь в таймаут по умолчанию (30 секунд)?
P.S. Сам запрос скинуть не могу, начальство не разрешает
Смотри EXPLAIN
Используй временные таблицы
Присмотрись к начальству, а точнее к их адекватности
Запрос вставь в текстовик и сделай замену полей на поле_1, поле_х, аналогично с названиями таблиц
1.Сделать необходимые индексы.
2.Разбить большой запрос на несколько маленьких. Даже если по коду будет казаться больше, но обычно несколько маленьких запросов выполняются быстрее, чем один большой. Запросы объединяйте с помощью временных таблиц или union.
PS: Вообще то что вы описали, не есть что-то страшное. Подобные запросы встречаются сплошь и рядом в разнообразных корпоративных системах. Начните с индексов, возможно до второго пункта и не доберетесь.
Насколько часто меняются данные?
Имеет смысл выполнять запрос в фоновом режиме (например по расписанию) и складывать результаты во временную таблицу, а уже из нее выдавать данные дальше.
Vapaamies: В вопросе, к сожалению, не прозвучало ни Postgresql, ни MySql, ни SQL Server. Поэтому я предложил планировщик. Ну и конечно же, смотреть индексы и анализировать план исполнения.
eugenehr: Я указал в тэгах Postgresql, скажите, как мне помогут индексы, если я использую представление? А при создании материализованного представления у меня "504 error"