Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Oracle分析功能是否昂贵?_Performance_Oracle_Function - Fatal编程技术网

Performance Oracle分析功能是否昂贵?

Performance Oracle分析功能是否昂贵?,performance,oracle,function,Performance,Oracle,Function,是否有人在使用oracle分析函数时遇到性能低下的问题?lead()oracle分析函数用于在表中生成新字段。基本上,它允许将前一行的字段值用作当前行的新字段值。explain计划表示对使用oracle分析功能的表执行完整的表扫描 为了避免这种全表扫描的成本,我可能需要使用after insert/update触发器手动使用前一行的值填充一个具体字段 是否有人因为oracle分析功能的高成本而决定不使用它?oracle分析函数是否应该很少使用?这取决于表的索引方式以及使用的函数 例如,ROW_N

是否有人在使用oracle分析函数时遇到性能低下的问题?lead()oracle分析函数用于在表中生成新字段。基本上,它允许将前一行的字段值用作当前行的新字段值。explain计划表示对使用oracle分析功能的表执行完整的表扫描

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


是否有人因为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进行筛选吗?