one*_*jig 10 oracle performance function
有没有人在使用oracle分析函数时遇到性能下降?lead()oracle分析函数用于在表中生成新字段.基本上,它允许将前一行的字段值用作当前行的新字段的值.解释计划表示在使用oracle分析函数的表上执行全表扫描.
为了避免这种全表扫描的成本,我可能只需使用插入/更新后触发器手动填充具有前一行值的具体字段
有人因为成本高而决定不使用oracle分析功能吗?是否应该很少使用oracle分析函数?
分析功能并非没有成本:它们必须存储需要内存的中间结果(运行总计,窗口函数......)的数据,它们还需要一些处理能力.某些函数需要到结果集的最后一行才能返回结果(例如MIN/MAX).大多数函数也将具有隐式SORT操作.
因此,它们在资源方面不是免费的,但它们是SET操作,因此大多数时候它们比编写自定义逐行plsql过程或传统SQL更有效.
您必须在特定情况下进行比较和基准测试,但如果您明智地使用它们,您将看到它们是强大的性能工具,而不是障碍.
这取决于您的表的索引方式以及您使用的函数。
ROW_NUMBER()
例如,ROWNUM
即使使用了索引,似乎也比 效率低。请参阅我博客中的这篇文章进行性能比较:
Oracle
的优化器了解窗口函数,并且可以使用一些技巧,例如STOPKEY
和 ,PUSHED RANK
这使得它们更加高效。
解释计划表示对使用oracle分析函数的表进行全表扫描。
表扫描本身还不错。如果TABLE ACCESS
检索索引中缺失的值比过滤和排序更昂贵,那么这实际上可能是最佳的。
通常,如果您的表已建立索引,则查询WHERE
和ORDER BY
子句允许使用此索引进行排序,并且优化器认为此索引值得使用,该WINDOW BUFFER
方法用于LAG
和LEAD
函数。
引擎只保留行的运行缓冲区2
(或更多,取决于偏移量的值)并返回第一行和第二行的值。
但是,优化器可能会认为该索引根本不值得使用。
在这种情况下,它将使用WINDOW SORT
:相同的东西,但排序是在内存或临时表空间中完成的。