SQL Developer 中流水线函数的性能很差

Posted

技术标签:

【中文标题】SQL Developer 中流水线函数的性能很差【英文标题】:Performance is poor of pipelined function in SQL Developer 【发布时间】:2015-03-19 10:09:22 【问题描述】:

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

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(&lt;PARAMETERS_LIST&gt;)) WHERE ROWNUM &lt;= 200 在 SQL Developer 中测试查询。 SQL Developer 需要 9 秒才能返回数据。

直接在 SQL Developer 中运行 &lt;A LITTLE BIT COMPLEX QUERY WITH PARAMETERS_LIST&gt; 需要 0.9 秒。

为什么流水线函数这么慢?

【问题讨论】:

查询找到多少行 - 使用普通查询,返回所有行、第一页结果还是 200 行需要 0.9 秒?直接运行时有rownum限制吗?如果是这样,那可能会针对停止键计数进行优化,但是在游标版本中不会发生这种情况,因为该函数不知道您当时正在限制结果。显示直接运行的执行计划可能会揭示一些东西;如果您将其限制为 200 行,也请显示没有该限制的执行计划。 SQL 开发人员显示前 50 行普通查询。我们还在普通查询和select * from TABLE(FOO(&lt;PARAMETERS_LIST&gt;)) WHERE ROWNUM &lt;= 50中添加rownum 【参考方案1】:

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

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

【讨论】:

应该只有两个上下文切换 - FOR r IN (qry) 自动优化为一次获取​​ 100 行。 感谢您的建议。我们会尽快进行调查并给您反馈。 这是由于缺少索引。上下文切换在这里不是问题,因为只需要 200 条记录。

以上是关于SQL Developer 中流水线函数的性能很差的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL Oracle 中需要此 T-Sql 函数的等效函数。如果有其他解决方案,那么流水线

Oracle SQL - 如何使用 JSP 调用 ODCI 流水线函数

使用 NOT IN(Oracle Sql Developer)的查询性能优化

为我的 ERP 系统做销售统计,但性能很差

将 SQL Server Express 升级到 Developer 性能计数器注册表一致性错误

影响数据库性能的主要因素都有哪些?