以下查询需要20秒才能运行。 user_table
有40054
条记录。 other_table
有14000
条记录
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
做事的方法,但有没有其他方法可以让这个循环运行得更快?
答案 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 ;