oracle - PLSQL:在 plsql 保存过程中处理临时表是个好主意吗?
问题描述
打算以此作为讨论。
我有一个结果表,它是从一个稍微复杂的查询(几个连接和 WHERE 子句)生成的,随着我们的继续,我将在过程中多次操作/引用。
我唯一能想到的是将查询结果存储在表中并在过程结束时删除表。这是一个可行的选择吗?有什么缺点?更好的选择?
解决方案
在存储过程中创建和删除表几乎总是错误的解决方案。
首先,您刚刚将查询转换为数据库更改;由于各种原因,这存在问题,尤其是特权升级。其次,DDL 可能由于多种原因而失败,因此这种方法引入了纯查询中不存在的危险。第三,创建、填充和删除表会增加开销。
最好的解决方案:只需编写一个高效的 SELECT 语句。
替代解决方案,按性能降序排列:
- 使用 WITH 子句来操作查询流
- 填充 PL/SQL 集合
- 在 18c 私有临时表中
- 全局临时表(它们是永久数据库表,只是临时数据)。
您的问题提出了一个查询初始结果集,然后以编程方式对其进行操作的场景。我的第一个想法是您应该尝试在纯 SQL 中执行此操作。Oracle 拥有大量的功能,尤其是分析功能,您会惊讶于在查询中可以做的事情之多。但是,如果您真的需要以程序方式工作,则填充和操作数组是下一个最具性能的方法。填充全局临时表的成本很高,因为它需要写入和读取磁盘。如果您受到会话内存的限制,或者您需要跨多个过程共享数据,则仅考虑 GTT。
推荐阅读
- java - 如何将嵌套列表转换为二维数组
- python - 根据条件组合熊猫行
- python - 如何在 scipy.integrate.RK45 中输入时间步长
- angularjs - 在 Angular.js 上的 HTML5 Canvas 中的背景图像上绘制一个矩形
- c# - 将图像保存到数据库中的重复项
- c++ - 如何在 C++ 中声明 std::bind 的 std::invoke_result?
- java - 如何链接不同类的两个对象?
- algorithm - 我如何从数学上计算这个算法的时间复杂度?
- flutter - 可访问性不会在颤动中读取一些文本如何解决?
- android - 借助 Android 在 Tensorflow 上创建一个简单的神经网络