具有阵列参数与固定参数性能的Oracle过程

具有阵列参数与固定参数性能的Oracle过程,oracle,plsql,database-performance,Oracle,Plsql,Database Performance,我想知道,如果我调用一个包含n个值的数组的过程,而不是调用一个只并行接受一个参数的过程n次,会对性能产生什么影响 我不是一个DB开发人员,但我们团队中的一个DB开发人员说,当您使用单个参数运行一个过程时,运行速度要快于使用单个元素的数组参数的过程。所以我在一个耗时的SP上测试了这个理论,结果证明是正确的 这是怎么回事?有人能解释一下吗?它是通用的还是数据模型特定的结果 我们非常感谢您的帮助,因为我们必须提高系统的性能,但必须确定一些长期运行的SP Kapil您可能希望坚持使用数组参数。与组合操作

我想知道,如果我调用一个包含n个值的数组的过程,而不是调用一个只并行接受一个参数的过程n次,会对性能产生什么影响

我不是一个DB开发人员,但我们团队中的一个DB开发人员说,当您使用单个参数运行一个过程时,运行速度要快于使用单个元素的数组参数的过程。所以我在一个耗时的SP上测试了这个理论,结果证明是正确的

这是怎么回事?有人能解释一下吗?它是通用的还是数据模型特定的结果

我们非常感谢您的帮助,因为我们必须提高系统的性能,但必须确定一些长期运行的SP


Kapil

您可能希望坚持使用数组参数。与组合操作的好处相比,支持多个值的额外开销是无关紧要的

批处理操作是数据库性能的关键。在集合、块、批量等中执行操作通常比逐行处理快几个数量级。我经常看到数百个JVM在一次一行地每分钟处理兆字节。我经常看到单个查询每分钟可以轻松处理千兆字节

这有一些例外。有些系统一次只做一件事。在这种情况下,你不得不担心这些琐事。我去过那里,很痛苦。这会导致荒谬的变化,比如说,因为在某些情况下,它们的速度可以无限快。在这种情况下,开始考虑完全重写

传入多个值应该快得多。它可以减少过程调用的数量(减少网络流量、查询解析等)。它可以让您使用诸如批量收集和
for all
(更少的解析,更少的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;
/

您是否有一些测试用例代码可以共享以演示问题?@TonyAndrews,感谢您花费时间和兴趣。我没有可以轻松演示的东西,因为这个过程本身就像2000多行,而且是公司专有的表格/数据,所以我很难重新创建场景。谢谢Jon,我感谢你的解释。对于我来说,这是一个很好的起点,可以在DB developer的帮助下进行研究,看看查询计划是什么样子的。将数组作为参数是否会影响查询计划?