2017-01-04 12 views
0

У меня есть следующий запрос 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 секунд в моем случае). Любая идея, почему это так медленно, и как ее можно оптимизировать?

+2

Как вы бежите в 'SELECT' запрос (SQLPlus, какой-то инструмент, ...)? Попробуйте 'select count (*) from (yourSelect)' и посмотреть, что произойдет. – Aleksej

+0

Попробуйте добавить подсказку append -/* + append */Может быть много, много причин (аппаратное обеспечение, конфигурация ОС, конфигурация таблицы). Сколько строк выбирает возврат? Сколько индексов на столе? – OldProgrammer

+1

Если у вас 20M строк в исходной таблице, вы можете иметь миллионы строк результатов для записи в таблицу 'lst'. Результат по своей сути медленнее, чем вход, плюс вы должны проверить ограничения, индексы обновления, * и т. Д. *. Относительное время, которое вы описываете, не похоже на стадион. –

ответ

0

Это очень трудно сказать, в чем причина, так как там может быть несколько вещей, таких как:

  • недостаточной памяти, или журнальные размер
  • неоптимальные настройки таблицы (PCTFREE и т.д.)
  • аппаратное обеспечение производительность вопрос

Две вещи, которые я бы рекомендовал:

  • проверить какие события ожидания
  • попытка вставки с АППЕНД намеком
INSERT /*+ APPEND */ 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 
+0

Спасибо, я попробую ключевое слово APPEND. Любые подсказки о том, как я могу проверить события ожидания? –

+0

Посмотрите на V $ SESSION_EVENT. – ms32035

 Смежные вопросы

  • Нет связанных вопросов^_^