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