как сделать оракул для петли быстро - PullRequest
1 голос
/ 19 июля 2010

Запрос ниже занимает 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 секунд.Так что я сделал из этого петлю.</p>

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 Ответ

2 голосов
/ 19 июля 2010

Можете ли вы обойти петлю?Я согласен с Янеком, если сам запрос занимает слишком много времени, возможно, вам придется использовать другой метод для его получения.И чтобы согласиться с Марком, если вы можете сделать это в одном запросе, то обязательно сделайте это.Но если вы не можете, отбросьте цикл, как показано ниже

Но попробуйте что-то вроде этого;бросить петлю:

/*
--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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...