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查询需要更多时间来执行的主要内容,如果未能解决你的问题,请参考以下文章