2013-11-28 6 views
0

Я создал эту процедуру.Процедура занимает много времени

DECLARE 
    cur SYS_REFCURSOR; 
    age_compare_group varchar(100); 
    state_compare varchar(100); 
    gender_compare varchar(100); 
    income_compare_groups varchar(100); 
    goal varchar(100); 
    valuestring varchar(100); 
BEGIN  

    OPEN cur FOR 
    'select distinct a.age_compare_group, s.state_compare , g.gender_compare, i.income_compare_groups,goal_types.goal,goal_types.valuestring 
     from age_group a , 
      state s , 
      gender g , 
      income_Group i , 
      (select ''goal'' as GOAL, valuestring 
       from appldata 
      where dataname like ''GOAL_CAT%'' 
       and datavalue in (select idcategory 
            from goal_categories 
            where typeuser = ''ECU'' 
           and id_entity = ''B001''))goal_types'; 

LOOP        

     -- process each row one at a time 
     FETCH cur into age_compare_group,state_compare, gender_compare,income_compare_groups,goal,valuestring; 
     insert into temp_test values (state_compare ,age_compare_group); 

END LOOP; 
    CLOSE cur; 
END; 

Но для этого требуется много времени.

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

+1

В вашем запросе нет соединений. Вы создаете декартовую продукцию между состоянием, полом, доходом и вложенным выбором - неудивительно, что он работает медленно. И дополнительно: вам вообще не нужен курсор. Но сначала начните с получения права 'select'. Также: начните использовать явный синтаксис' JOIN' вместо предполагаемых неявных объединений - если бы вы сделали это с самого начала, вы бы не создали декартовой продукт в первую очередь. –

+0

да, потому что это я хотел. –

+1

Вы * хотите * декартовой продукт между всеми этими таблицами? Вы понимаете, что это такое? Я очень сомневаюсь, что ты действительно этого хочешь. И если вы это сделаете, то почему вы устраняете все дубликаты, которые создаются из-за декартова продукта, используя предложение 'distinct'? –

ответ

2

«Одна строка в то время» всегда медленнее, чем «все строки сразу», и с помощью динамического SQL без необходимости медленнее, чем при использовании статического SQL, так почему бы не попробовать:

begin 
     insert into temp_test values (state_compare ,age_compare_group) 
     select distinct s.state_compare, a.age_compare_group 
      from age_group a , 
       state s , 
       gender g , 
       income_Group i , 
       (select 'goal' as GOAL, valuestring 
        from appldata 
        where dataname like 'GOAL_CAT%' 
        and datavalue in (select idcategory 
             from goal_categories 
             where typeuser = 'ECU' 
           and id_entity = 'B001'))goal_types; 
end; 
+0

Насколько я согласен, я сомневаюсь, что это улучшит производительность. Проблема заключается в том, что оператор select выглядит совершенно неправильно. –

+0

Я также предполагаю, что запрос неверен, этот простой «выберите отдельный s.state_compare, a.age_compare_group from age_group a, Состояние s должно вернуть тот же результат, что и ваш –

1

Вы пытаетесь вставить результат запроса в другую таблицу? Если это делается, то

insert into temp_test select distinct s.state_compare, a.age_compare_group 
    from age_group a , 
     state s , 
     gender g , 
     income_Group i , 
     (select 'goal' as GOAL, valuestring 
      from appldata 
     where dataname like 'GOAL_CAT%' 
      and datavalue in (select idcategory 
           from goal_categories 
           where typeuser = 'ECU' 
          and id_entity = 'B001'))goal_types; 
Смежные вопросы