首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle分析函数是否成本高昂?

Oracle分析函数是否成本高昂?
EN

Stack Overflow用户
提问于 2009-09-23 16:08:46
回答 4查看 13.9K关注 0票数 10

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

为了避免这次全表扫描的开销,我可能只需要使用after insert/update触发器用前一行的值手动填充一个具体字段

有没有人因为oracle分析函数的高成本而决定不使用它?是否应该很少使用oracle分析函数?

EN

回答 4

Stack Overflow用户

发布于 2009-09-23 16:20:28

分析函数不是没有代价的:它们必须存储中间结果的数据(运行总计、窗口函数...)这需要内存,也需要一些处理能力。有些函数需要到达结果集的最后一行才能返回结果(例如MIN/MAX)。大多数函数还将具有隐式排序操作。

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

您必须在您的特定情况下进行比较和基准测试,但如果您明智地使用它们,您将看到它们是一个强大的性能工具,而不是一个障碍。

票数 7
EN

Stack Overflow用户

发布于 2009-09-23 16:10:04

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

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

  • :**

Oracle的优化器了解窗口函数,并且可以使用一些技巧,如STOPKEYPUSHED RANK,这些技巧可以使它们更高效。

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

表扫描本身还不错。如果检索索引中缺失的值的TABLE ACCESS比过滤和排序的开销更大,那么这实际上可能是最优的。

通常,如果您的表已建立索引,则查询WHEREORDER BY子句允许使用此索引进行排序,并且优化器认为此索引值得使用,则LAGLEAD函数使用WINDOW BUFFER方法。

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

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

在本例中,它将使用WINDOW SORT:相同的方法,但排序是在内存或临时表空间中完成的。

票数 3
EN

Stack Overflow用户

发布于 2009-09-23 22:49:04

关于这一点的一些细节可以在Jonathan Lewis的博客here上找到。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1467018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档