本帖最后由 ariesying 于 2010-02-04 16:50:19 编辑

解决方案 »

  1.   

    业务太难理解了楼主可以用test窗口去分析下,proc中瓶颈sql语句最后优化瓶颈sql语句
      

  2.   

    你自己调试下,那段时间执行的时候用的时间长,针对该段SQL执行优化
      

  3.   

    pl/sql developer -- test windows -- create profiler report -- F8 --分析性能
      

  4.   

    while太多,第一个检测已经循环搜索了一遍,第二个合并又循环搜索了一遍,而且第二个循环里面,一次循环就2个update还包含在for里面,还有2个单独的update,这么多更新语句你看看能不能在逻辑方面进行一下优化。
    另外,第一个while检测,最好不要循环去做,而是利用sql一次搞定。这里给个参考:--自定义数组,用来保存输入的字符串分隔后的数据
    create or replace type numTableType as table of number 
    / --这个是把输入的字符串用,分开生成数组的,你可以把,改成;
    create or replace function str2numList(
    p_string in varchar2 
    ) return numTableType 
    as 
    v_str long default p_string || ','; --输入为'1,2,3,4',在这里变为'1,2,3,4,'以便下面的循环进行分隔
    v_n number; 
    v_data numTableType := numTableType(); 
    begin 
    loop 
    v_n := to_number(instr( v_str, ',' )); 
    exit when (nvl(v_n,0) = 0); 
    v_data.extend; 
    v_data(v_data.count) := ltrim(rtrim(substr(v_str,1,v_n-1))); 
    v_str := substr(v_str, v_n+1); 
    end loop; 
    return v_data; 
    end;
    /create or replace procedure proc_get_favorite(
    in_session_key IN dat_ct_user_session.session_key%TYPE,
    in_series_id_lst IN varchar2,
    in_resolution IN dat_ct_series_status.resolution%TYPE,
    out_cr_favorite OUT SYS_REFCURSOR,
    out_flag OUT number
    )
    AS
    begin
    update dat_ct_user_session set last_access_time = SYSTIMESTAMP where session_key = in_session_key; if SQL%NOTFOUND then
    out_flag := -1;
    else
    open out_cr_favorite for
    select ss.series_id,s.series_name,ss.max_chapter_no,ss.end_status from dat_ct_series s,dat_ct_series_status ss
    where s.series_id = ss.series_id
    and s.status = 'A'
    and ss.resolution = in_resolution
    and ss.series_id in( --关键是这里,把输入的字符串分隔以后形成一个数组,然后把数组当作表来用。你那里可以这样做,然后利用一个sql来判断是否是同一个城市的客户。
    select * from 
    THE (select cast(str2numList(in_series_id_lst) as numtableType) from dual) 
          )
    order by s.init_letter,s.series_name; 
    out_flag := 0;
    end if; Exception when others then
    raise;
    end proc_get_favorite;
    /
      

  5.   

    你可以先定义一个数组保存分隔后的客户id,如果检测通过,下面的循环可以通过操作这个数组来做,跟你上面的whiile计算出v_count是一样的。
      

  6.   

    问一下,是in()比如快?还是多次查询快?
    如果in的参数分别对应10个以内,100个的话