Практически никогда не бывает разницы в производительности между процедурами и функциями.
В очень редких случаях:
- Аргумент процедуры
IN OUT
быстрее, чем возврат функции, если встраивание включено.
- Аргумент процедуры
IN OUT
выполняется медленнее, чем возврат функции, когда встраивание отключено.
Тестовый код
--Run one of these to set optimization level:
--alter session set plsql_optimize_level=0;
--alter session set plsql_optimize_level=1;
--alter session set plsql_optimize_level=2;
--alter session set plsql_optimize_level=3;
--Run this to compare times. Move the comment to enable the procedure or the function.
declare
v_result varchar2(4000);
procedure test_procedure(p_result in out varchar2) is
begin
p_result := '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
end;
function test_function return varchar2 is
begin
return '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
end;
begin
for i in 1 .. 10000000 loop
--Comment out one of these lines to change the test.
--test_procedure(v_result);
v_result := test_function;
end loop;
end;
/
Результаты
Inlining enabled: PLSQL_OPTIMIZE_LEVEL = 2 (default) or 3
Function run time in seconds: 2.839, 2.933, 2.979
Procedure run time in seconds: 1.685, 1.700, 1.762
Inlining disabled: PLSQL_OPTIMIZE_LEVEL = 0 or 1
Function run time in seconds: 5.164, 4.967, 5.632
Procedure run time in seconds: 6.1, 6.006, 6.037
Приведенный выше код тривиален и, возможно, требует других оптимизаций. Но я видел аналогичные результаты с производственным кодом.
Почему разница не имеет значения
Не смотрите на приведенный выше тест и не думайте, что «процедура выполняется в два раза быстрее, чем функция!». Да, накладные расходы функции почти вдвое больше, чем накладные расходы процедуры. Но в любом случае накладные расходы несущественно малы.
Ключ к производительности базы данных - выполнять как можно больше работы в операторах SQL, партиями. Если программа вызывает функцию или процедуру десять миллионов раз в секунду, то у этой программы есть серьезные проблемы с дизайном.
person
Jon Heller
schedule
01.12.2014