Долго отрабатывает конвейерная функция на Oracle
Имею табличную функцию на Oracle 19с, которую вызываю таким образом: SELECT * FROM TABLE(pkg_wapp_assistant.f_wapp_assistant_calc(in_id_calc => 1, in_id_request => 24))
При тестировании получаю время отработки 22-23 сек. Но при логировании кода получаю обработку логики в 1 сек:
- 13.06.2023 14:16:11 start
- 13.06.2023 14:16:11 into logic
- 13.06.2023 14:16:11 open cur
- 13.06.2023 14:16:11 1
- 13.06.2023 14:16:11 2
- 13.06.2023 14:16:11 3
- 13.06.2023 14:16:11 4
- 13.06.2023 14:16:11 close cur
Возник резонный вопрос, что занимает 20 сек. времени при расчете, если данные уже готовы для вывода через 1 сек.
Код функции:
FUNCTION f_wapp_assistant_calc
(
in_id_calc IN NUMBER,
in_id_request IN NUMBER
) RETURN t_wapp_assistant_response_table
PIPELINED IS
l_rec t_wapp_assistant_response_record;
l_logic CLOB;
TYPE l_cur_type IS REF CURSOR;
l_cur l_cur_type;
BEGIN
dbms_output.put_line(to_char(SYSDATE, 'dd.mm.yyyy hh24:mi:ss') || ' start');
SELECT c.logic INTO l_logic FROM codecpm.ag_tmp_calc c WHERE c.id_calc = in_id_calc;
dbms_output.put_line(to_char(SYSDATE, 'dd.mm.yyyy hh24:mi:ss') || ' into logic');
OPEN l_cur FOR l_logic
USING in_id_request;
dbms_output.put_line(to_char(SYSDATE, 'dd.mm.yyyy hh24:mi:ss') || ' open cur');
LOOP
FETCH l_cur
INTO l_rec;
EXIT WHEN l_cur%NOTFOUND;
PIPE ROW(l_rec);
dbms_output.put_line(to_char(SYSDATE, 'dd.mm.yyyy hh24:mi:ss') || ' ' ||
l_cur%ROWCOUNT);
END LOOP;
CLOSE l_cur;
dbms_output.put_line(to_char(SYSDATE, 'dd.mm.yyyy hh24:mi:ss') || ' close cur');
END;```