首页 > 解决方案 > PLSQL:在 plsql 保存过程中处理临时表是个好主意吗?

问题描述

打算以此作为讨论。

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

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

标签: oracleplsql

解决方案


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

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

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

替代解决方案,按性能降序排列:

  • 使用 WITH 子句来操作查询流
  • 填充 PL/SQL 集合
  • 在 18c 私有临时表中
  • 全局临时表(它们是永久数据库表,只是临时数据)。

您的问题提出了一个查询初始结果集,然后以编程方式对其进行操作的场景。我的第一个想法是您应该尝试在纯 SQL 中执行此操作。Oracle 拥有大量的功能,尤其是分析功能,您会惊讶于在查询中可以做的事情之多。但是,如果您真的需要以程序方式工作,则填充和操作数组是下一个最具性能的方法。填充全局临时表的成本很高,因为它需要写入和读取磁盘。如果您受到会话内存的限制,或者您需要跨多个过程共享数据,则仅考虑 GTT。


推荐阅读