【问题标题】:Are Oracle Analytic Functions costly?Oracle 分析功能成本高吗?
【发布时间】:2010-11-30 19:43:20
【问题描述】:

有没有人在使用 oracle 分析函数时遇到性能下降的问题? Lead() oracle 分析函数用于在表中生成一个新字段。基本上,它将允许将前一行的字段值用作当前行的新字段的值。解释计划指示对使用了 oracle 分析函数的表执行全表扫描。

为了避免这种全表扫描的成本,我可能只需要使用插入/更新后触发器手动填充具有前一行值的具体字段

有没有人因为成本高而决定不使用预言机分析功能? oracle解析函数应该少用吗?

【问题讨论】:

  • 为什么不向我们展示您的代码?没有它,很难提供好的建议。我不明白为什么分析函数必须进行全表扫描?你不能先用 where 子句过滤 id 吗?

标签: performance oracle function


【解决方案1】:

这取决于您的表的索引方式以及您使用的函数。

例如,ROW_NUMBER() 的效率似乎低于ROWNUM,即使使用了索引也是如此。有关性能比较,请参阅我的博客中的这篇文章:

Oracle 的优化器了解窗口函数,可以使用STOPKEY 和PUSHED RANK 等一些技巧来提高它们的效率。

解释计划表示对使用oracle分析函数的表执行全表扫描。

表扫描本身还不错。如果使用TABLE ACCESS 检索索引中缺失的值比过滤和排序更昂贵,这可能确实是最优的。

通常,如果你的表被索引,查询WHERE和ORDER BY子句允许使用这个索引进行排序并且优化器认为这个索引值得使用,WINDOW BUFFER方法用于LAG和LEAD功能。

引擎只保留2 行(或更多,取决于偏移量的值)的运行缓冲区,并返回第一行和第二行的值。

但是,优化器可以认为索引根本不值得使用。

在这种情况下,它将使用WINDOW SORT:同样的事情,但排序是在内存或临时表空间中完成的。

【讨论】:

    【解决方案2】:

    分析函数并非没有成本:它们必须为需要内存的中间结果(运行总计、窗口函数...)存储数据,并且它们还需要一些处理能力。某些函数需要到达结果集的最后一行才能返回结果(例如 MIN/MAX)。大多数函数也会有一个隐式的 SORT 操作。

    因此它们在资源方面不是免费的,但它们是 SET 操作,因此在大多数情况下它们比编写自定义的逐行 plsql 过程或传统 SQL 更有效。

    您必须针对您的具体情况进行比较和基准测试,但如果您明智地使用它们,您会发现它们是一种强大的性能工具,而不是障碍。

    【讨论】:

      【解决方案3】:

      乔纳森·刘易斯的博客here 提供了有关这方面的一些详细信息。

      真正的问题应该是,它们是否比替代方案成本更高或更低,这将取决于特定情况。在某些情况下,您可能更愿意将数据提取到应用服务器并在那里进行处理,因为在该级别拥有额外的硬件通常更便宜/更容易。

      但如果要在 SQL 中执行和添加 PL/SQL 处理之间进行选择,我通常会使用 SQL。

      【讨论】:

        【解决方案4】:

        当然,他们是有成本的,你必须决定你是否有能力支付。

        在我的例子中,我创建了一个存储过程,它迭代一个表并使用 Oracle Lead() 函数计算一些日期并将结果存储在另一个表中。最后,我在我的应用程序中使用这个稍后的表并每周更新第一个表(运行存储过程)一次,因为该数据不会经常更改。

        对我来说,这是最好的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-27
          • 2012-08-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多