1

我有一个流水线表函数,比如

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;

我通过在 SQL Developer 中测试查询select * from TABLE(FOO(<PARAMETERS_LIST>)) WHERE ROWNUM <= 200。SQL Developer 需要 9 秒才能返回数据。

<A LITTLE BIT COMPLEX QUERY WITH PARAMETERS_LIST>直接在 SQL Developer 中运行需要 0.9 秒。

为什么流水线功能这么慢?

4

1 回答 1

0

在不了解您的数据库或实际功能的情况下很难说,可能是一系列事情,例如缺少索引。

您可以做的是查看 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

于 2015-03-19T10:17:49.673 回答