【发布时间】:2018-03-21 22:45:48
【问题描述】:
我正在尝试加快我的更新并将我的更新/设置语句转换为合并到/使用。
旧版本
ALTER SESSION ENABLE PARALLEL DML;
UPDATE /*+ PARALLEL(16) */ TEST_REPORT_2 rep
SET ( title ) = (
SELECT /*+ PARALLEL(16) */ doctitle.valstr Title
FROM MV_LLATTRDATA_SHRUNK_V3 doctitle
WHERE doctitle.id = rep.dataid
AND doctitle.defid = 3072256
AND doctitle.attrid = 5
AND doctitle.vernum = (SELECT MV.MAX_VERNUM
FROM MV_LLATTRDATA_MAX_VERSIONS_V1 MV
WHERE MV.id = rep.dataid
AND defid = 3072256
AND attrid = 5)
AND doctitle.defvern = (SELECT MV.MAX_DEFVERN
FROM MV_LLATTRDATA_MAX_VERSIONS_V1 MV
WHERE MV.id = rep.dataid
AND defid = 3072256
AND attrid = 5));
新版本
MERGE INTO TEST_REPORT_2 REP
USING MV_LLATTRDATA_SHRUNK_V3 doctitle
ON (REP.DATAID = doctitle.ID
AND doctitle.defid = 3072256
AND doctitle.attrid = 5
AND doctitle.vernum = (SELECT MV.MAX_VERNUM
FROM MV_LLATTRDATA_MAX_VERSIONS_V1 MV
WHERE MV.id = rep.dataid
AND defid = 3072256
AND attrid = 5)
AND doctitle.defvern = (SELECT MV.MAX_DEFVERN
FROM MV_LLATTRDATA_MAX_VERSIONS_V1 MV
WHERE MV.id = rep.dataid))
WHEN MATCHED THEN UPDATE SET
TITLE = doctitle.VALSTR;
但是我收到一条错误消息:“ORA-01427:单行子查询返回多于一行”
【问题讨论】:
-
不管眼前的问题(使 MERGE 工作) - 为什么您期望 MERGE 比 UPDATE 更快?双向测试——如果你能发布你发现的东西,这对我们所有人都有启发。