PLSQL:在plsql保存的过程中处理临时表是个好主意吗?

mas*_*efi 0 oracle plsql

打算进行讨论。

我有一个结果表,它是由一个稍微复杂的查询(几个Joins和WHERE子句)生成的,随着我们的进行,我将在过程中多次操作/引用。

我唯一能想到的就是将查询结果存储在一个表中,并在过程结束时删除该表。这是可行的选择吗?有什么缺点?更好的选择?

APC*_*APC 6

在存储过程中创建和删除表几乎总是错误的解决方案。

首先,您刚刚将查询转换为数据库更改;由于多种原因,这是有问题的,但特别是特权升级。其次,DDL可能由于多种原因而失败,因此这种方法引入了危险,而这种危险在纯查询中不存在。第三,创建,填充和删除表会增加开销。

最佳解决方案:只需编写高效的SELECT语句。

以性能降序排列的替代解决方案:

  • 使用WITH子句操纵查询流
  • 填充PL / SQL集合
  • 在18c私人临时表中
  • 全局临时表。

您的问题提出了一种查询初始结果集,然后以编程方式对其进行处理的方案。我首先想到的是您应该尝试在纯SQL中执行此操作。Oracle具有广泛的功能库,尤其是分析功能库,您将对查询中可以执行的操作数量感到惊讶。但是,如果您真的需要以过程方式进行工作,则填充和操作数组是下一个最有效的方法。填充全局临时表非常昂贵,因为它需要写入磁盘和从磁盘读取数据。如果您受到会话内存的限制,或者需要在多个过程之间共享数据,则仅考虑GTT。