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

Posted

技术标签:

【中文标题】pl sql查询需要更多时间来执行【英文标题】:pl sql query takes more time to execute 【发布时间】:2013-12-02 05:55:30 【问题描述】:

我在工作场所发现了这个 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 秒才能执行。所有需要的列都被索引。谁能告诉我这个查询中哪些地方需要进一步优化?

【问题讨论】:

什么是m_resconfirmid?我在任何地方都没有看到它的声明。 检查您在查询中使用的表是否应该有正确的索引。 @Mikhail 'm_resconfirmid' 是调用函数时整数类型的参数 可能取决于您的表。它们有多大? 每张表超过500条记录 【参考方案1】:

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

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 也是如此。

干杯

【讨论】:

以上是关于pl sql查询需要更多时间来执行的主要内容,如果未能解决你的问题,请参考以下文章

PL/Sql 查询执行错误

PL/SQL 不存在查询

为啥这个 PL/SQL 查询不使用 ODP.NET 执行

PL/SQL:将词法参数传递给存储过程

使用 sqoop 的两个 (PL)/SQL 查询

在 PL SQL 中使用“执行”和目录执行查询语句有啥区别?