【发布时间】:2026-02-05 19:55:02
【问题描述】:
我有一个关于如何处理整体 SQL 查询错误的问题。我们正在使用 Oracle PL/SQL。我们的大部分代码库都是逐行处理,最终导致性能极差。据我了解,最大的问题是 PL/SQL 和 SQL 引擎之间的上下文切换。
问题在于用户不知道出了什么问题。旧样式就像:
- 部分数据上方的光标
- 如果数据存在,则在另一个表中触发 SELECT(计数),如果不存在则显示 errormsg
- 选择该数据
- 如果数据存在,则在另一个表中触发第二个 SELECT(计数),如果不存在则显示 errormsg
- 选择该数据
- 修改其他一些表
这可能会持续 10-20 张桌子。它基本上很像一个 C 程序。可以将其改造成类似:
UPDATE (
SELECT TAB1.Status,
10 AS New_Status
FROM TAB1
INNER JOIN TAB2 ON TAB1.FieldX = TAB2.FieldX
INNER ..
INNER ..
INNER ..
INNER ..
LEFT ..
LEFT ..
WHERE TAB1.FieldY = 2
AND TAB3.FieldA = 'ABC'
AND ..
AND ..
AND ..
AND ..
) TAB
SET TAB.Status = New_Status
WHERE TAB.Status = 5;
像这样的整体 SELECT 会极大地加速很多事情。我更改了一些类似的查询,这些查询从 5 小时缩短到 3 分钟,但这有点容易,因为它是一项无需人工交互的服务。
问题是,如果有人填写表格并等待回复,您将如何处理此类事情。因此,如果出现问题,他们需要一个 errormsg。我想到的唯一解决方案是检查行是否已更新,如果没有则跳转到仍然执行所有单个选择以确定该错误的另一个代码部分。但是在每次更改之后,我们都必须更新整体选择和所有单项选择。猜测一段时间后它们会有所不同并导致更多问题。
另一种解决方案是通用 errormsg,它会导致每天调用数百次,我们将 50 个变量替换到查询中,杀死一些 where 条件/连接以找出过滤掉所需行的条件。
那么,什么是正确的方法来获得性能并且仍然有点用户友好。目前我们的系统感觉无法使用缓慢。如果您按下一个按钮,您通常需要等待很长时间(通常为 3-10 秒,一些更复杂的任务需要 5 分钟)。
【问题讨论】:
-
所以,简而言之,您是说应用程序根据用户输入运行一些复杂的更新语句,可能会更新 0 行,在这种情况下,您需要返回一个向用户显示错误并指出问题出在他们提供的数据中?如果允许用户输入不存在的信息,听起来您的应用程序中可能存在某种验证问题。表之间是否存在外键?应用端的信息是如何缓存的?我们在谈论什么样的数据和应用程序?
-
我们谈论的是仓库管理系统。让我们想象一下,用户想要将一个托盘放入他刚刚扫描了条形码的存储箱中。我们需要检查该储物箱是否被锁定,该类型的储物箱是否允许该托盘类型,该储物箱是否只允许某些物品,该储物箱可容纳多少个托盘等等。所以有需要检查大量实时数据,因为许多其他人都在使用相同的数据,所以状态很重要。
标签: oracle performance plsql user-experience