Sql 提高oracle中Merge语句的性能
我有下面的合并查询,它对于小数据集来说工作得很好,但对于800000k行来说,执行它需要40分钟以上 在这个合并查询中,我试图使用Insert/Update/Delete执行增量导入逻辑。对于具有唯一columnID_LL_ID_UU,TKR组合的新数据,我希望插入数据,否则将进行更新。删除,从测试数据表中删除测试数据表中不存在的数据 如何改进此查询中的性能?是否有其他有效编写此查询的方法Sql 提高oracle中Merge语句的性能,sql,oracle,performance,merge,Sql,Oracle,Performance,Merge,我有下面的合并查询,它对于小数据集来说工作得很好,但对于800000k行来说,执行它需要40分钟以上 在这个合并查询中,我试图使用Insert/Update/Delete执行增量导入逻辑。对于具有唯一columnID_LL_ID_UU,TKR组合的新数据,我希望插入数据,否则将进行更新。删除,从测试数据表中删除测试数据表中不存在的数据 如何改进此查询中的性能?是否有其他有效编写此查询的方法 MERGE INTO TEST_RUA_MER T USING ( SELECT
MERGE
INTO TEST_RUA_MER T
USING (
SELECT T.ROWID T_RID,
CASE
WHEN S.ROWID IS NULL THEN 1
WHEN DECODE(S.CLASS,T.CLASS,1) = 1
AND
DECODE(S.NAME,T.NAME,1) = 1
THEN 1
END DELETE_FLAG,
S.*
FROM TEST_RUA S
FULL JOIN
TEST_RUA_MER T
ON(
DECODE(T.ID_LL,S.ID_LL,1) = 1
AND
DECODE(T.ID_UU,S.ID_UU,1) = 1
AND
DECODE(T.TKR,S.TKR,1) = 1
)
) S
ON (
T.ROWID = S.T_RID
)
WHEN MATCHED
THEN
UPDATE
SET T.CLASS = S.CLASS,
T.NAME = S.NAME
DELETE WHERE S.DELETE_FLAG = 1
WHEN NOT MATCHED
THEN
INSERT
VALUES(
S.CLASS,
S.ID_LL,
S.ID_UU,
S.TKR,
S.NAME
)
为什么要使用DECODE函数而不只是检查值是否相等?只要联接中使用的列被正确索引,这将返回相同的结果,并有望提高性能
合并到测试集
使用SELECT T.ROWID T_RID,
案例
当S.ROWID为空时,则为1
当S.CLASS=T.CLASS且S.NAME=T.NAME时,则为1
结束删除_标志,
美国*
来自TEST_RUA S
完全连接测试
在T.ID_LL=S.ID_LL和T.ID_UU=S.ID_UU和T.TKR=S.TKR S上
关于T.ROWID=S.T\u RID
匹配时
然后
更新集T.CLASS=S.CLASS,T.NAME=S.NAME
删去
其中S.DELETE_标志=1
当不匹配时
然后
插入值S.CLASS,
美国律师协会,
S.ID_UU,
S.TKR,
美国名字
您是否可以在没有完全联接的情况下进行查询,这可能会对您有所帮助,或者您是否尝试了更新语句瓶颈在哪里?执行计划是否显示任何迹象?@hkandpal update运行速度更快。@eshirvana我检查了解释计划,发现大部分cpu成本是通过以下方式产生的:哈希连接右外部系统。查看散列连接外部存储库查询工作更快,但问题是现在查询逻辑已更改…现在它不处理唯一值ID_LL或ID_UU或TKR的null值…因此,当这些值中的任何一个为null时,它不检查delta逻辑decode的显著优点是它将null视为等于null-与直接相等不同检查如果你不熟悉解码,不要问OP,您只需快速搜索即可找到。@mathguy实际上我有点困惑,为什么唯一组合现在不处理空值,因为OP已经编写了与decode相同的直接eaulity检查。.实际上,我删除了decode部分,因此它不能正确处理delta逻辑的空值…例如,当任何字段都不会从TEST\u RUA\u MER表中删除数据,即使该行与TEST\u RUA表相同,我们是否可以在此处单独创建Delete以降低性能,但问题是,我们是否需要在Delete中处理空值,或者使用现有的oracle功能(如果有)?