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

执行pl sql查询需要更多时间,sql,performance,oracle,plsql,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

我在我的工作场所发现了此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秒。所有需要的列都被索引。任何人都可以告诉我在这个查询中哪里需要更优化?

为什么要将光标声明为单独的varchar? 相反,我将使用游标的常规声明,分析Oracle要执行的查询需要时间,因此在当前代码的declare-and-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
query2也是这样


干杯

什么是重新确认?我在任何地方都看不到它的声明。请检查您在查询中使用的表上是否应有正确的索引。@Mikhail'm\u resconfirid'是整数类型的参数,调用该函数时可能依赖于您的表。它们有多大?每个表有500多条记录