【发布时间】:2019-11-11 15:36:41
【问题描述】:
我有一个性能问题,也许你可以帮忙解决。当我打开游标时,我会运行其他几个 SELECT 语句来使用游标中的变量检索值(见下文)。这似乎减慢了整个过程;我认为这是因为 PL/SQL 和 SQL 引擎之间的切换。使用表格集合会有帮助吗?但正如我所见,由于我需要来自不同表的不同列,我需要有几个不同的集合,我如何在一条记录中输出所有内容以返回结果集?
CREATE OR REPLACE procedure sp_test (in_input in number)
as
v_calc number;
v_calc_res number;
v1 number;
v2 number;
v3 number;
CURSOR C_test IS
select col1 from test where col1 = in_input;
begin
open c_test
loop
fetch c_test into v_calc;
select col1 into v1 from t1;
select col1 into v2 from t2;
select col1 into v3 from t3;
v_calc_res := v_calc * 5 * v1 * v2 * v3;
dbms_output.put_line(v_calc_res);
end loop;
end sp_test;
/
【问题讨论】:
-
您可能觉得需要混淆您的查询,但不幸的是,所有 blah-blah-blah 都只是 meh。我们几乎无法为您提供建议。请阅读this answer on asking Oracle performance questions。它将解释您需要提供多少信息才能在此处获得满意的答案;它还可以指导您如何诊断(甚至可能解决)您自己的问题。
-
您的示例(我对其进行了编辑以简化标识符名称)在循环中缺少退出条件;希望您的真实代码没有丢失?另外,循环内的选择语句与游标有何关系?最后,您如何确保循环中的选择最多返回一行?
-
嗨 Boneist,是的,有退出条件(我只是给出了一个简单的例子,而不是实际的代码)。循环内的 Select 语句只是从 Where 子句中的光标中获取变量。
标签: oracle performance plsql query-optimization