2013-11-28 31 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

您的查询没有做任何连接。你正在创造一个笛卡尔的产品,在国家,性别,收入和嵌套选择之间 - 难怪它运行缓慢。另外:你根本不需要光标。但首先要让你的'选择'权利开始另外:开始使用明确的'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

我也假定查询是错误的,这个简单的'select'从age_group a中选择不同的s.state_compare,a.age_compare_group , state 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;