我想知道是否可以提高类似以下查询的查询速度:
Begin
FOR r IN (
select org_id ,name from op_units order by 1
) LOOP
dbms_application_info.set_client_info (r.org_id);
for x in (
select PDI.PROJECT_NUMBER, ppv.description
from PA_DRAFT_INVOICES_V PDI
LEFT JOIN pa_projects_v ppv ON ppv.project_id = pdi.project_id
WHERE PDI.CREATION_DATE > to_date('01/07/2018', 'DD-MM-YYYY')
) LOOP
dbms_output.put_line(x.PROJECT_NUMBER||'~'||x.description);
END LOOP;
END LOOP;
end;
上面的查询(但是具有多个联接和列)需要很多时间才能完成。我只能想象由于dbms_output.put_line
有更好的方法吗?最终将结果显示到gridview
谢谢!
答案 0 :(得分:0)
如果必须使用外部循环,可以通过将行插入到(全局临时?)表中来避免内部循环;完成后,从该表中SELECT
。像这样:
begin
for r in (select org_id , name from op_units) loop
dbms_application_info.set_client_info (r.org_id);
insert into temp_table (project_number, description)
select pdi.project_number, ppv.description
from pa_draft_invoices_v pdi
left join pa_projects_v ppv on ppv.project_id = pdi.project_id
where pdi.creation_date > to_date('01/07/2018', 'DD-MM-YYYY');
end loop;
end;
/
完成后,
select * from temp_table;
我要在(外)循环中删除ORDER BY
;它只会执行32次,但是-有什么意义?
使用DBMS_OUTPUT.PUT_LINE
不能很好地扩展。如果有很多数据,您甚至可能用完缓冲区。此外,您还必须等到在输出上绘制一切。此外,它也不灵活-您无法对其进行排序,对其应用过滤器...-对于您要进行的每个更改,都必须一次又一次地运行相同的查询。但是,如果所有内容都存储在表中,则您可以免费做事。