Performance Oracle分析功能是否昂贵?
是否有人在使用oracle分析函数时遇到性能低下的问题?lead()oracle分析函数用于在表中生成新字段。基本上,它允许将前一行的字段值用作当前行的新字段值。explain计划表示对使用oracle分析功能的表执行完整的表扫描 为了避免这种全表扫描的成本,我可能需要使用after insert/update触发器手动使用前一行的值填充一个具体字段Performance Oracle分析功能是否昂贵?,performance,oracle,function,Performance,Oracle,Function,是否有人在使用oracle分析函数时遇到性能低下的问题?lead()oracle分析函数用于在表中生成新字段。基本上,它允许将前一行的字段值用作当前行的新字段值。explain计划表示对使用oracle分析功能的表执行完整的表扫描 为了避免这种全表扫描的成本,我可能需要使用after insert/update触发器手动使用前一行的值填充一个具体字段 是否有人因为oracle分析功能的高成本而决定不使用它?oracle分析函数是否应该很少使用?这取决于表的索引方式以及使用的函数 例如,ROW_N
是否有人因为oracle分析功能的高成本而决定不使用它?oracle分析函数是否应该很少使用?这取决于表的索引方式以及使用的函数 例如,
ROW_NUMBER()
,即使使用了索引,其效率似乎低于ROWNUM
。有关性能比较,请参阅我博客中的这篇文章:
Oracle
的优化器了解窗口函数,可以使用一些技巧,如STOPKEY
和push-RANK
,使它们更高效
explain计划表示对使用oracle分析功能的表执行完整的表扫描
表格扫描本身也不错。如果检索索引中缺少的值的表访问
比过滤和排序更昂贵,那么这可能确实是最佳的
通常,如果您的表已编制索引,则查询WHERE
和ORDER BY
子句允许使用此索引进行排序,并且优化器认为此索引值得使用,WINDOW BUFFER
方法用于LAG
和LEAD
函数
引擎只保留一个2行(或更多行,取决于偏移量的值)的运行缓冲区,并返回第一行和第二行的值
但是,优化器可以考虑不值得使用的索引。
在这种情况下,它将使用窗口排序
:同样的事情,但排序是在内存或临时表空间中完成的。分析函数并非没有成本:它们必须存储中间结果的数据(运行总计、窗口函数…),这需要内存,并且还需要一些处理能力。有些函数需要到达结果集的最后一行才能返回结果(例如,MIN/MAX)。大多数函数还具有隐式排序操作
因此,它们在资源方面不是免费的,但它们是集合操作,因此在大多数情况下,它们比编写定制的逐行plsql过程或传统的SQL要高效得多
你必须在你的具体案例中进行比较和基准测试,但如果你明智地使用它们,你会发现它们是一个强大的性能工具,而不是一个障碍。乔纳森·刘易斯的博客上提供了一些关于这方面的详细信息
真正的问题应该是,它们比替代方案的成本高还是低,这将取决于具体情况。在某些情况下,您可能更愿意将数据拉到应用程序服务器并在那里进行处理,因为在该级别上使用额外的硬件通常更便宜/更容易
但是如果在SQL和添加PL/SQL处理之间进行选择,我通常会使用SQL。当然,它们是有成本的,您必须决定是否能够支付
在我的例子中,我创建了一个存储过程,该过程使用Oracle lead()函数迭代一个表并计算一些日期,然后将结果存储在另一个表中。最后,我在我的应用程序中使用后面的表,并每周更新一次第一个表(运行存储过程),因为数据不会频繁更改
对我来说,这是最好的解决方案。为什么不向我们展示您的代码?没有它,很难提供好的建议。我不明白为什么分析函数必须进行全表扫描?不能先用where子句对id进行筛选吗?