我是 PL-SQL Oracle11g 中相对较新的开发人员。 作为我学习的一部分,我正在与讲师就表上 UPDATE 操作的有效性进行辩论。
在下面的代码中,我认为应该添加 WHERE EXISTS 部分,因为它优化了操作并防止在放置中没有找到值的情况下进行不必要的更新,即 SET c.text = NULL
UPDATE customer c
SET c.text =
(SELECT tmp.offer_desc
FROM tmp_main tmp
WHERE c.o_id = tmp.o_id
AND c.c_id = tmp.c_id)
** WHERE EXISTS (SELECT 1
FROM tmp_main_program_line_txt tmp
WHERE c.o_id = tmp.o_id
AND c.c_id = tmp.c_id)**;
需要注意的是,该操作会影响数百万条记录,因此运行时间和资源使用至关重要。
另一方面,我的讲师声称这是不必要的,而且我在这次运行中执行两次 SELECT 操作这一事实是没有意义的,应该删除 WHERE EXISTS 代码段。
我完全困惑了。 我也使用Oracle执行计划来验证两种方式,可以明显看出使用前面提到的WHERE EXISTS时成本更低。 但我缺乏经验可能会误导我..?
那么什么应该/更好/有效?
您关于使用 WHERE EXISTS 进行此 UPDATE 操作的推理是正确的。但仍有可能提高性能
我会使用单个 MERGE 命令,例如:
融入客户c 使用 tmp_main tmp ON(c.o_id = tmp.o_id 且 c.c_id = tmp.c_id) 当匹配时 更新集 c.text = tmp.offer_desc;
选择合并而不是更新:
在根据另一个表中的匹配行执行条件更新时,MERGE 语句通常可以提供卓越的效率。与 UPDATE 不同,MERGE 只会对存在匹配的行进行操作,有效地取代了 WHERE EXISTS 的需要,并使 Oracle 能够在单次扫描中执行操作,这既更快又更节省资源。
防止不必要的 NULL 赋值:
使用 MERGE 自然可以防止在没有匹配行的情况下将 c.text 设置为 NULL,否则如果您对不匹配的记录使用 SET c.text = NULL,则在 UPDATE 操作中会发生这种情况。 MERGE 语句仅将更新限制为具有匹配 o_id 和 c_id 的行,确保它仅执行必要的更新并节省资源。