Мой запрос занимает слишком много времени для завершения - PullRequest
1 голос
/ 06 октября 2011

У меня есть запрос, который занимает много времени, чтобы закончить в Oracle.Он работал несколько часов, прежде чем я его убил.Можно ли как-нибудь ускорить его?

Вот мой запрос:

select distinct(random_selection.randnum), 
    random_selection.dropper_id, 
    random_selection.ozip3 
from random_selection 
where random_selection.dropper_id is not null 
and random_selection.quarter = 121
and (random_selection.dropper_id, random_selection.randnum, random_selection.quarter) in 
    (select forecast_entry.dropper, forecast_entry.rand_num, production_weeks.yyq 
    from forecast_entry, production_weeks 
    where forecast_entry.week = production_weeks.production_week 
    and production_weeks.project_cd = 'EXFC' 
    and production_weeks.yyq >= 121)

union 

select distinct(random_selection.randnum), 
    dropper_city_brk_2.dropper_id, 
    random_selection.ozip3 
from random_selection, dropper_city_brk_2, dropper 
where random_selection.ozip3 = dropper_city_brk_2.zip3 
and dropper.dropper_id = dropper_city_brk_2.dropper_id 
and dropper.active = 1 
and dropper_city_brk_2.dropper_id <> 10002 
and random_selection.quarter = 121
and random_selection.dropper_id is null 
and (random_selection.dropper_id, random_selection.randnum, random_selection.quarter) in 
    (select forecast_entry.dropper, forecast_entry.rand_num, production_weeks.yyq 
    from forecast_entry, production_weeks 
    where forecast_entry.week = production_weeks.production_week 
    and production_weeks.project_cd = 'EXFC' 
    and production_weeks.yyq >= 121)

Запрос объяснен:

главная цель - получить все ранднум,dropper_id и ozip3 из таблицы random_selection, которых нет в таблице forecast_entry, они находятся в yyq 121 и имеют код проекта EXFC.yyq извлекается из таблицы production_weeks, связывая неделю и рабочую неделю.Некоторые dropper_id являются нулевыми, поэтому нам нужно извлечь эти данные из таблицы dropper_city_brk_2, связав ozip3 и zip3.Мы не хотим, чтобы dropper_id были неактивны, поэтому они должны иметь активное значение, равное 1, это связано с таблицей дроппера.

надеюсь, что это поможет

1 Ответ

1 голос
/ 07 октября 2011

Я согласен с комментаторами, что вы должны предоставить по крайней мере вывод объяснения в виде суть, иначе очень трудно помочь.

Вы дважды выполняете подзапросcast_entry, production_weeks.Вы можете повысить производительность, используя CREATE TEMPORARY TABLE для однократного вычисления этого запроса.

Вы используете «where X in (подзапрос)», что часто менее эффективно, чем выполнение объединения.Вместо использования предложения IN вы можете выполнить INNER JOIN для временной таблицы, которую я только что предложил.

Вы можете переключиться на UNION ALL, если вы можете допускать дубликаты или если вы знаете, что дубликатов нет.UNION ALL требует меньше работы для DB, чем UNION.

Наконец, вы можете разбить это на три части и протестировать каждый по отдельности.Части - это подзапрос и два запроса, которые вы объединяете.Это может помочь вам определить, какие части медленные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...