有没有人在使用oracle分析函数时遇到过性能缓慢的问题?使用lead() oracle分析函数在表中生成一个新字段。基本上,它允许将前一行的字段值用作当前行的新字段的值。explain计划指示对使用oracle分析函数的表执行全表扫描。
为了避免这次全表扫描的开销,我可能只需要使用after insert/update触发器用前一行的值手动填充一个具体字段
有没有人因为oracle分析函数的高成本而决定不使用它?是否应该很少使用oracle分析函数?
发布于 2009-09-23 16:20:28
分析函数不是没有代价的:它们必须存储中间结果的数据(运行总计、窗口函数...)这需要内存,也需要一些处理能力。有些函数需要到达结果集的最后一行才能返回结果(例如MIN/MAX)。大多数函数还将具有隐式排序操作。
因此,它们在资源方面不是免费的,但它们是集合操作,因此在大多数情况下,它们比编写自定义的逐行plsql过程或传统SQL高效得多。
您必须在您的特定情况下进行比较和基准测试,但如果您明智地使用它们,您将看到它们是一个强大的性能工具,而不是一个障碍。
发布于 2009-09-23 16:10:04
这取决于表的索引方式以及使用的函数。
例如,即使使用了索引,ROW_NUMBER()的效率似乎也不如ROWNUM。有关性能比较,请参阅我博客中的这篇文章:
Oracle的优化器了解窗口函数,并且可以使用一些技巧,如STOPKEY和PUSHED RANK,这些技巧可以使它们更高效。
解释计划指示对使用oracle分析函数的表执行全表扫描。
表扫描本身还不错。如果检索索引中缺失的值的TABLE ACCESS比过滤和排序的开销更大,那么这实际上可能是最优的。
通常,如果您的表已建立索引,则查询WHERE和ORDER BY子句允许使用此索引进行排序,并且优化器认为此索引值得使用,则LAG和LEAD函数使用WINDOW BUFFER方法。
引擎只保留2行的运行缓冲区(或者更多,取决于偏移量的值),并返回第一行和第二行的值。
但是,优化器可能会认为该索引根本不值得使用。
在本例中,它将使用WINDOW SORT:相同的方法,但排序是在内存或临时表空间中完成的。
发布于 2009-09-23 22:49:04
关于这一点的一些细节可以在Jonathan Lewis的博客here上找到。
真正的问题应该是,它们比替代方案的成本更高还是更低,这将取决于特定的情况。在某些情况下,您可能更喜欢将数据拉到应用程序服务器并在那里进行处理,因为在该级别拥有额外的硬件通常更便宜/更容易。
但是,如果要在SQL和添加PL/SQL处理之间进行选择,我通常会使用SQL。
https://stackoverflow.com/questions/1467018
复制相似问题