Oracle merge into 基于大数据量的优化方向

Oracle merge into 基于大数据量的优化方向

针对Oracle数据库的更新操作我们会使用

update tableName set col1=col2 where condition...

这样子的事务提交效率比较低下,所以大部分情况下需要批量更新的话我们会使用merge into 进行替换

merge into target_tableName t
using (
	select id , col1, col2 ... from source_tableName
) a
on (t.id= a.id)
when matched then 
update set
t.col1=a.col1 ,
t.col2=a.col2 ,
...
when not matched then 
 insert
        (t.col1,
         t.col2,
         t.col3,
         ...
         )
      values
        (a.col1,
         a.col2,
         a.col3,
         ...);

常规的merge into 的应用如上,对于日常的数据量是基本符合要求的

这里要讨论面对大数据量时的优化方向

1.存储优化

merge into 的执行过程会load 两部分数据,一部分是需要更新的目标表,还有用于比对数据的using中的临时表,而using 中载入的表数据集需要等到merge into 执行完之后才会释放,而如果你using中包含了多张表的关联逻辑

如:

merge into target_TableName
using(
	select a.col1 from tablea a 
    	left join tableb b on a.id=b.id
   		left join tablec c on a.id=c.id
)....

如上逻辑,会导致using过程需要加载tablea,tableb,tablec 三张表的数据到一块临时表空间中,这样会导致内存的压力上升(针对大数据量下,小数据量可以忽略)

针对这种情况可以使用oracle提供的临时表进行优化

如:

drop table TMP_table_a;
    create global temporary table TMP_table_a (
    	col1 varchar2(64),
        col2 varchar2(64),
        col3 varchar2(64),
        col4 varchar2(64),
        col5 varchar2(64)
)
on commit delete rows;
--此临时表的功效是在事务进行提交之后,会删除掉表中所有的行

借助临时表的功能,可以提前将关联逻辑后的结果插入到临时表,merge into 之取临时表就可以了

insert into TMP_table_a values(col1 , col2 ...)
select col1,col2 .. from tablea a left join tableb b on a.id=b.id
....conditions

--在进行merge into
merge into target_TableName t
using(
	select col1... from TMP_table_a ..
) a
on (a.col1=t.col1)
when matched then 
update set 
t.col1 = a.col1 
when not matched then 
 insert
        (t.col1,
         t.col2,
         t.col3,
         ...
         )
      values
        (a.col1,
         a.col2,
         a.col3,
         ...);
2.减少对比数据量

减少对比数据量对于业务需求的理解能力要求相对高点,需要找到能够过过滤的条件,

比如对于每天增量的表就可以通过控制日期

(结合上面的存储优化,可以选择在插入临时表的时候就进行优化)

insert into TMP_table_a values(col1 , col2 ...)
select col1,col2 .. from tablea a left join tableb b on a.id=b.id
....where lastupdatedate>=end_date and conditions..
--lastupdatedate>=end_date
3.优化执行顺序

正常的使用merge into 的话,通常会使用

when matched then ...
when not matched then ...
--用于区分采取insert into 操作还是 update 操作

这样做有个比较大的弊端,merge into 它是通过对比数据来选择操作的,会从目标表中每一条数据和你的逻辑结果集(using 中的结果)中的数据进行比对,如果你的结果集过大,那么就会在

on (…)

这块数据比对逻辑这里耗费比较多的时间,而update set 和 insert into 是分开的,也就是说它会比对两次数据,所以在实际中,为了提高性能支持,会将insert into 从merge into 中抽离出来,merge into 只做更新操作

--merge into 只做更新
merge into target_tableName 
using(select col1... from TMP_table_a ..
) a
on (a.col1=t.col1)
when matched then 
update set 
t.col1 = a.col1  ;

--后续插入操作
insert into target_tableName (col1..) 
select col1 from TMP_table_a 
where conditions ...

补充:

​ 在将insert into 从merge into 中抽离出来后,还涉及到一个执行顺序的问题

​ 也就是表的初始化,一个新表进行初始化的时候,表是空的,所以优先执行merge into 是非常快的,因为里面没有任何数据需要更新,然后就直接走插入数据的流程

​ 如果先执行insert into 的话,导致表内存在数据了,进行merge into 进行update的话,有需要比对数据

以上是对Oracle Merge into 操作进行优化的一些方向和建议

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Oracle中的MERGE INTO语句可以用于将数据从一个表合并到另一个表中。为了优化MERGE INTO语句的性能,可以采取以下措施: 1. 确保表有正确的索引,以便在合并过程中快速访问数据。 2. 使用合适的WHERE子句来限制要合并的数据,以减少查询的复杂度。 3. 使用合适的JOIN条件来确保只有需要合并的数据才会被查询和更新。 4. 使用合适的事务隔离级别来确保数据的一致性和完整性。 5. 使用合适的并发控制机制来避免并发更新冲突。 6. 使用合适的优化器提示来指导优化器生成最优的执行计划。 7. 使用合适的统计信息来确保优化器能够生成准确的执行计划。 8. 使用合适的存储参数来确保数据能够被高效地存储和检索。 ### 回答2: Oracle中的MERGE INTO语句是一种极其实用的语句,它可以用来更新已有数据并且插入新数据。但是由于MERGE INTO语句涉及多个表的操作,如果不进行优化,就容易出现性能瓶颈。 以下是一些优化MERGE INTO语句的方法: 1. 使用合适的索引:使用合适的索引(如主键、唯一索引或组合索引等)可以加速MERGE INTO语句。 2. 确定具体的需求:在MERGE INTO语句之前,要充分考虑想要完成的实际操作,以确保MERGE INTO语句的效率。 3. 避免过度使用JOIN:MERGE INTO语句中的JOIN操作可能会导致性能下降,因此应该尽避免过度使用JOIN操作。 4. 按顺序执行优化MERGE INTO语句的性能可以优化,通过按照执行顺序在WHERE和ON子句中先评估最有可能过滤的条件来实现。 5. 避免在WHERE和ON子句中使用计算:MERGE INTO语句的性能可以优化,通过避免在WHERE和ON子句中使用计算表达式来实现。 总之,优化MERGE INTO语句需要通过多种方法和技术来实现。这需要在开发过程中不断的修改和完善实现,通过调试和优化来提高MERGE INTO语句的运行效率。 ### 回答3: Oracle中的MERGE INTO语句可以用来同时执行INSERT、UPDATE和DELETE操作。在操作大批数据时,我们需要优化MERGE INTO语句以提高效率。以下是一些优化MERGE INTO的方法: 1.使用合适的索引 在MERGE INTO语句中,如果使用了JOIN条件,最好为该条件的字段建立索引。这可以提高查询效率,减少数据查找的时间。 2.缩小WHERE子句的范围 在MERGE INTO语句中,WHERE子句可以限制操作的数据行数,这非常有用。但是,如果WHERE子句范围太大,会导致操作变慢。因此,需要缩小WHERE子句的范围,例如限制操作时间段、状态等条件。 3.限制行锁和表锁 在MERGE INTO语句中,如果不注意锁定机制,可能会导致锁定冲突,从而降低性能。为了避免这种情况,可以使用行锁或表锁,但需要根据情况选择合适的锁定范围,以保证操作效率。 4.避免触发器 在MERGE INTO语句中,如果在目标表中有触发器,可能会影响操作效率。因此,最好在操作前禁用触发器,以避免不必要的影响。 5.使用合适的批操作方式 在MERGE INTO语句中,批操作方式是十分重要的。Oracle提供了一些批操作函数,例如BULK COLLECT和FORALL语句,可以提高操作效率。因此,需要根据情况选择最合适的批操作方式。 总之,优化MERGE INTO语句可以提高Oracle数据库的操作效率,提高系统的整体性能。需要从索引、WHERE子句、锁定机制、触发器和批操作等方面进行综合考虑和优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值