Oracle Analytic Functions是否代价高昂?

one*_*jig 10 oracle performance function

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

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

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

Vin*_*rat 6

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

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

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


Qua*_*noi 3

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

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

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

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

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

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

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

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

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