pl sql查询需要更多时间来执行

时间:2013-12-02 05:55:30

标签: sql performance oracle plsql

我在我的工作场所发现了这个PL / SQL,但我找不到这个脚本需要花费这么多时间才能执行的原因:

DECLARE
    query           VARCHAR(500);
    ref_cur         REFCURSOR;
    product_listH   VARCHAR(1000):='';
    product_listA   VARCHAR(1000):='';  
    product_listP   VARCHAR(1000):='';  
    product     VARCHAR(100):='';
begin

    query := ' select hotelname
                 from sch1.resconfirmsv rr,
                      sch1.reshoteldetailssv hd,sch2.respkgconfirmsv r '||
               ' where rr.id = hd.resconfirmid and
                       hd.resconfirmid = r.hotelconfirmid and
                       r.id = ' || m_resconfirmid || '';
    OPEN ref_cur FOR EXECUTE query;
    LOOP
        FETCH ref_cur INTO product;
        IF NOT FOUND THEN
            EXIT; -- exit loop
        END IF;
        product_listH  := product_listH||''||trim(COALESCE(product,'-'))||',<br>';
    END LOOP;
    product_listH := rtrim(trim(product_listH),',<br>');
    CLOSE ref_cur;


    query := ' select distinct programname
                 from sch1.resconfirmsv rr,
                      sch3.resactivitysv a,
                      sch3.resprogramsv hx,
                      sch2.respkgconfirmsv r '||
               ' where rr.id = hx.resconfirmid and
                       hx.id=a.resprogramid and
                       hx.resconfirmid = r.activitiesconfirmid and
                       r.id = ' || m_resconfirmid || '';
        OPEN ref_cur FOR EXECUTE query;
        LOOP
            FETCH ref_cur INTO product;
            IF NOT FOUND THEN
                EXIT; -- exit loop
            END IF;
            product_listA  := product_listA||''||trim(COALESCE(product,'-'))||',<br>';
        END LOOP;
        product_listA := rtrim(trim(product_listA),',<br>');
        CLOSE ref_cur;
        product_listP := product_listH || ',<br>' || product_listA;
        product_listP := rtrim(trim(product_listP),',<br>');
        product_listP = ltrim(rtrim(product_listP,',<br>'),',<br>');
        RETURN product_listP;
    end;

没有此脚本,总运行时间为12.176秒,使用此脚本需要达到18.802秒,这至少需要6秒才能执行。所有需要的列都被编入索引。任何人都可以告诉我在这个查询中哪些地方需要更优化?

1 个答案:

答案 0 :(得分:0)

为什么将游标声明为单独的varchar? 相反,我会使用游标的正常声明,分析要由Oracle执行的查询需要时间,因此(在当前代码的declare-和Begin-标签之间:

cursor ref_cur as
  select distinct programname
  from sch1.resconfirmsv rr,
       sch3.resactivitysv a,
       sch3.resprogramsv hx,
       sch2.respkgconfirmsv r '||
  where rr.id = hx.resconfirmid and
   hx.id=a.resprogramid and
   hx.resconfirmid = r.activitiesconfirmid and
   r.id = m_resconfirmid;

现在你可以使用

For x in ref_cur loop

查询#2也是一样。

干杯