SQL 开发人员中流水线函数的性能很差
Performance is poor of pipelined function in SQL Developer
我有一个像
这样的流水线table函数
FUNCTION FOO
(
<PARAMETERS_LIST>
) RETURN T_TAB PIPELINED
AS
BEGIN
FOR rec IN
(<A LITTLE BIT COMPLEX QUERY WITH PARAMETERS_LIST>)
LOOP
PIPE row(T_WF(<COLUMN_LIST>));
END LOOP;
RETURN;
END FOO;
我通过 select * from TABLE(FOO(<PARAMETERS_LIST>)) WHERE ROWNUM <= 200
在 SQL 开发人员中测试查询。 SQL 开发人员需要 9 秒才能获得 return 数据。
虽然 运行 <A LITTLE BIT COMPLEX QUERY WITH PARAMETERS_LIST>
直接在 SQL Developer 中需要 0.9 秒才能得到结果。
为什么流水线函数这么慢?
在不了解您的数据库或实际功能的情况下很难说,可能是一系列的事情,例如缺少索引。
您可以做的是查看 oracle 用于执行查询的计划:
explain plan for select * from TABLE(FOO(<PARAMETERS_LIST>)) WHERE ROWNUM <= 200
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY);
这可能会给您提供瓶颈所在的线索。
顺便说一句,您在函数中使用了循环,这可能会导致上下文切换,这肯定会降低性能(很多)。如果可以的话,尽量避免它。有关上下文切换的更多信息:http://rajiboracle.blogspot.nl/2014/06/context-switches-and-performance-issue.html
我有一个像
这样的流水线table函数FUNCTION FOO
(
<PARAMETERS_LIST>
) RETURN T_TAB PIPELINED
AS
BEGIN
FOR rec IN
(<A LITTLE BIT COMPLEX QUERY WITH PARAMETERS_LIST>)
LOOP
PIPE row(T_WF(<COLUMN_LIST>));
END LOOP;
RETURN;
END FOO;
我通过 select * from TABLE(FOO(<PARAMETERS_LIST>)) WHERE ROWNUM <= 200
在 SQL 开发人员中测试查询。 SQL 开发人员需要 9 秒才能获得 return 数据。
虽然 运行 <A LITTLE BIT COMPLEX QUERY WITH PARAMETERS_LIST>
直接在 SQL Developer 中需要 0.9 秒才能得到结果。
为什么流水线函数这么慢?
在不了解您的数据库或实际功能的情况下很难说,可能是一系列的事情,例如缺少索引。
您可以做的是查看 oracle 用于执行查询的计划:
explain plan for select * from TABLE(FOO(<PARAMETERS_LIST>)) WHERE ROWNUM <= 200
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY);
这可能会给您提供瓶颈所在的线索。
顺便说一句,您在函数中使用了循环,这可能会导致上下文切换,这肯定会降低性能(很多)。如果可以的话,尽量避免它。有关上下文切换的更多信息:http://rajiboracle.blogspot.nl/2014/06/context-switches-and-performance-issue.html