Oracle过程与数组参数vs固定参数性能比较

12 浏览
0 Comments

Oracle过程与数组参数vs固定参数性能比较

我想知道如果我调用一个接受n个值的数组参数的过程与同时调用n次只接受一个参数的过程相比,性能会受到什么影响。

我不是一个数据库开发人员,但我们团队中的一个数据库开发人员说,如果一个过程只有一个参数,那么它的运行速度比一个包含单个元素的数组参数的过程要快。所以我在一个耗时较长的存储过程上测试了这个理论,结果证明是正确的。

这是怎么回事?有人能解释一下吗?这是普遍现象还是只针对特定的数据模型结果?

非常感谢帮助,因为我们需要改善系统的性能,解决一些运行时间较长的存储过程问题。

Kapil

0
0 Comments

Oracle Procedure with Array param vs fixed param performance 这个问题的出现的原因是:在处理数据库操作时,批处理操作是提高性能的关键。相比逐行处理,以集合、块、批量等形式执行操作通常比较快。然而,如果仅考虑调用次数庞大的简单过程的开销,使用数组会比较慢。

解决方法是:使用数组作为参数可以提高性能,减少过程调用的次数,减少网络流量、查询解析等开销。同时,还可以利用批量收集(bulk collect)和FORALL等功能,减少SQL和PL/SQL之间的上下文切换等开销。

以下是一个示例,使用复合数据类型需要28秒,而使用原始数据类型只需要7秒。

declare
    v_number number := 1;
    v_numbers sys.odcinumberlist := sys.odcinumberlist(1);
    v_number_out number;
    procedure one_parameter(p_value in number, p_return out number) is
    begin
        p_return := p_value+1;
    end;
    procedure many_parameters(p_value in sys.odcinumberlist, p_return out number) is
        v_number number;
    begin
        p_return := p_value(1)+1;
    end;
begin
    --10M: 7.035
    --10M: 7.004
    for i in 1 .. 100000000 loop
        --Using predefined variables:
        --one_parameter(v_number, v_number_out);              -- 7.0035 seconds
        --many_parameters(v_numbers, v_number_out);           -- 7.004 seconds
        --Passing in values:
        --one_parameter(1, v_number_out);                     -- 7.161 seconds
        many_parameters(sys.odcinumberlist(1), v_number_out); -- 27.877 seconds
    end loop;
    --Make sure the number is used so it won't be optimized away.
    dbms_output.put_line(v_number_out);
end;
/

总之,使用数组作为参数可以提高数据库操作的性能,但在考虑调用次数庞大的简单过程时,使用数组可能会比较慢。因此,需要根据具体情况进行选择。

0