避免在 Oracle 过程中频繁调用同一视图

Posted

技术标签:

【中文标题】避免在 Oracle 过程中频繁调用同一视图【英文标题】:Avoiding frequent call to same view inside a Oracle procedure 【发布时间】:2020-08-25 05:01:42 【问题描述】:

我有一个 oracle 视图,它从不同的表返回 500 万条记录,我使用这个视图使用单个过程插入到不同的表中,在这个过程中我多次使用它,这会影响性能,有什么办法吗我们可以查询视图一次,然后我可以在多个地方使用它?

【问题讨论】:

GTT 总是有用的,但您需要找出性能问题的根本原因。使用查看次数不是问题,但如何过滤可能是问题。我希望您使用不同的标准访问每个单独的用法,以及是否使用这些索引?当我们无法对表进行最小结构更改的情况下进行任何类型的调整时,我会选择 GTT。 Sujith,我们现在不能做任何结构上的改变,我希望遵循 GTT 比在同一个过程中多次查询相同的视图更好。 【参考方案1】:

视图是存储的查询;本身,它不包含任何数据。如果它的代码很复杂,并且使用不同的条件、聚合等从多个表中获取数据,那么访问数据可能需要一些时间。

在您的情况下,全局(或私有;取决于您使用的 Oracle 版本)临时表 (GTT) 可能会有所帮助。

创建一次 在过程开始时,将视图中的数据插入其中 其余的过程将使用那些准备好的数据 一旦会话(或事务;取决于您如何设置 GTT)结束,表中的数据就会丢失 下次运行该过程时可以重复使用该表

【讨论】:

谢谢小脚,它有 500 万个数据,是否建议将其存储在临时表中?我希望这会提高性能,因为它每次只查询一个表...... 不客气。正如我所说:如果获取数据需要时间,这种方法可能会有所帮助。如果一个视图足够简单并且返回的数据不多,那么您可以一直只使用它(一个视图)。试试 GTT,正确索引它,看看它的表现如何。

以上是关于避免在 Oracle 过程中频繁调用同一视图的主要内容,如果未能解决你的问题,请参考以下文章

对同一张表读写频繁如何避免锁表

如何避免多次调用同一个函数?

Python爬虫如何避免爬取网站访问过于频繁

避免使用 cookie 来自同一用户的多个视图

在 oracle 中避免全局临时表的方法

SwiftUI - 如何在修改来自同一结构的状态变量时避免刷新列表