如何提高包含 Update 的 Merge 语句的性能

Posted

技术标签:

【中文标题】如何提高包含 Update 的 Merge 语句的性能【英文标题】:How to improve performance of a Merge statement having Update in it 【发布时间】:2020-05-13 13:28:03 【问题描述】:

我们在 2 个表上有一个 MERGE STATEMENT,我们的批处理作业每天运行。 问题是 Merge 语句有时需要大约 20-25 分钟,有时需要 更新相同数量的数据大约需要 50-60 分钟。

MERGE INTO /*+ ENABLE_PARALLEL_DML PARALLEL ($DOP) */ TAB1 Subpartition  (SUBAPARTITION_KEY2) A 
         USING  $TAB2 B
         ON (A.ROWID = B.R1 and B.subpartition_key=SUBAPARTITION_KEY1)
         WHEN MATCHED THEN UPDATE SET change_status_code = B.change_status_code

此外,即使我在 R1 字段的 TAB2 上创建索引,解释计划也不会显示正在使用的索引。

谁能建议这里应该做什么.. 每天更新大约 4-5 百万条记录

【问题讨论】:

出于某种原因,我认为 2 的因素可能是由于系统上的其他活动——比如表/行/页上的锁定。您可以检查运行的执行计划,看看是否有任何变化。但是,执行计划的更改通常会对性能产生更大的影响。 不...桌子上没有任何类型的锁等。一件事是我们每周都会在桌子上收集统计信息,并且我们的批处理作业每天都在运行...而且那里表上有很多分区/子分区,因为它有大量数据 您是否尝试过正常更新与合并?您看到解释计划有什么不同。无法看到合并语句的 INSERT。 不...我没有尝试正常更新...我们为此设置了删除和插入语句。(大约一年前)..由于 2 个 DML 语句花费了大量时间,这就是我们用 MERGE 语句替换 delete/insert 的原因......但是在测试合并的实现时,我检查了更新,它比 Merge 花费了更多的时间..这就是我们选择 Merge 的原因 TAB1 子分区的行数和大小是多少?看起来 $TAB2 是一个子查询,你能检查一下这是否需要时间吗?另外,你有没有试过把它变成一个相关的更新语句? 【参考方案1】:

提示必须紧跟在第一个关键字之后。

改变这个:

MERGE INTO /*+ ENABLE_PARALLEL_DML PARALLEL ($DOP) */ ...

到这里:

MERGE /*+ ENABLE_PARALLEL_DML PARALLEL ($DOP) */ INTO  ...

【讨论】:

以上是关于如何提高包含 Update 的 Merge 语句的性能的主要内容,如果未能解决你的问题,请参考以下文章

Oracle merge into 的效率问题

Oracle Merge语句

hibernate中如何使用merge()用法举例

Merge Into 语句代替Insert/Update在Oracle中的应用实战

merge into 语句代替Insert/Update

Oracle 使用MERGE INTO 语句更新数据