У меня есть следующий запрос Oracle, который выполняется быстро (в течение нескольких секунд):оракул вставки в очень медленном
select contract_id_fk as ct,
max(trip_id) as tid,
max(consumed_mileage) as cum
from trip
where to_date > to_date('20-12-2016','DD-MM-YYYY')
and contract_id_fk is not null
and vehicle_id_fk is not null
and trip_stop_status is null
group by contract_id_fk
«путешествие» таблица имеет большое количество подряд (более 20 миллионов) Теперь я хочу вставить результат этого запроса в таблицу, используя:
INSERT INTO lst
select contract_id_fk as ct,
max(trip_id) as tid,
max(consumed_mileage) as cum
from trip
where to_date > to_date('20-12-2016','DD-MM-YYYY')
and contract_id_fk is not null
and vehicle_id_fk is not null
and trip_stop_status is null
group by contract_id_fk
Это очень медленно. Так медленно, что транзакция истекает (более 30 секунд в моем случае). Любая идея, почему это так медленно, и как ее можно оптимизировать?
Как вы бежите в 'SELECT' запрос (SQLPlus, какой-то инструмент, ...)? Попробуйте 'select count (*) from (yourSelect)' и посмотреть, что произойдет. – Aleksej
Попробуйте добавить подсказку append -/* + append */Может быть много, много причин (аппаратное обеспечение, конфигурация ОС, конфигурация таблицы). Сколько строк выбирает возврат? Сколько индексов на столе? – OldProgrammer
Если у вас 20M строк в исходной таблице, вы можете иметь миллионы строк результатов для записи в таблицу 'lst'. Результат по своей сути медленнее, чем вход, плюс вы должны проверить ограничения, индексы обновления, * и т. Д. *. Относительное время, которое вы описываете, не похоже на стадион. –