如何让oracle for loop快速

时间:2010-07-19 15:32:45

标签: oracle optimization loops

以下查询需要20秒才能运行。 user_table40054条记录。 other_table14000条记录

select count(a.user_id) from user_table a, other_table b 
where a.user_id = b.user_id;

我们的限制是任何超过8秒的查询都会被杀死...> _<我已经运行了解释计划,在这里提出问题,但根据我们的限制,我无法在不到8秒的时间内运行此查询。所以我做了一个循环。

begin
FOR i IN role_user_rec.FIRST .. role_user_rec.LAST LOOP
            SELECT COUNT (a.user_id) INTO v_into FROM user_table a
            WHERE TRIM(role_user_rec(i).user_id) = TRIM(a.user_id);
          v_count := v_count + v_into;
END LOOP;

我知道限制很糟糕,这不是effecient做事的方法,但有没有其他方法可以让这个循环运行得更快?

1 个答案:

答案 0 :(得分:2)

你能绕过这个循环吗?我同意Janek,如果查询本身需要太长时间,你可能需要采用不同的方法来获取它。并同意马克,如果你能在一个查询中做到这一点,那么一定要这样做。但如果不能,请按以下方式删除循环

但尝试这样的事情;放弃循环:

/*
--set up for demo/test
Create Type Testusertype As Object(User_Id Number , User_Name Varchar2(500));
CREATE TYPE TESTUSERTYPETABLE IS TABLE OF TESTUSERTYPE;
*/

Declare
  Tutt Testusertypetable;
  TOTALCOUNT NUMBER ;
Begin 

    Select Testusertype(Object_Id,Object_Name)
       bulk collect into TUTT
      From User_Objects
    ;

Dbms_Output.Put_Line(Tutt.Count);

Select Count(*) Into Totalcount 
  From User_Objects Uu 
       Inner Join Table(Tutt) T
       ON T.User_Id = Uu.Object_Id;

Dbms_Output.Put_Line(Tutt.Count);
Dbms_Output.Put_Line(Totalcount);

End ;