Oracle merge into 的效率问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle merge into 的效率问题相关的知识,希望对你有一定的参考价值。

类似语句:merge into a using(select *from a inner join b on a.id=b.id) ........
源表和要更新的表是同一张表,当表a总数据量达到一定量时,该语句执行就特别慢,即使源数据量较小
请问为什么,该如何解决呢

merge into主要是要将a与using的表进行一一对比,随着a表的增大,using后的表查询的速度在变慢,主要优化select *from a inner join b on a.id=b.id这条查询,因为a表在不断增大,b表的大小如何,二者的连接关系是什么,通过执行计划可以看出。

你把这条sql的执行计划发出来,我帮你看看 我的企鹅号码343548233

希望能帮助你
参考技术A 确认一下问题的条件:
1、merge 是比较函数,比较的数据量越大,效率越低;
2、如果有插入操作,而且插入的操作的还是其中一个比较用的表,效率会更低下(相当于你每走一步都回头看一下,肯定影响往前走的速度);
3、如果数据量很大,不妨先查询出结果再用插入算法,不用merge。

Oracle 使用MERGE INTO 语句更新数据

/*Merge into 详细介绍
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。 
*/
/*语法:
MERGE [INTO [schema .] table [t_alias] 
USING [schema .] { table | view | subquery } [t_alias] 
ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;
*/

 

 1 MERGE INTO T_PRODUCT t
 2 USING T_PRODUCT_TEMP u 
 3 ON ( u.id=t.id)
 4 WHEN MATCHED THEN
 5     UPDATE  SET t.name = u.name,t.orderid = u.orderid,
 6      t.descr = u.descr
 7      --delete where u.id=1 
 8 WHEN NOT MATCHED THEN 
 9     INSERT (id, name, orderid, descr) VALUES(u.id, u.name,u.orderid, u.descr)
10 --WHEN NOT MATCHED BY u and t.id=u.id THEN
11   --Delete; 

新特性的功能,加快的复制表数据的性能,一次性的读取,可以快速把数据复制到目标表中,其中在update中还支持delete语句的写法

可过过滤些不需要更新的数据。速度还是很不错的。













以上是关于Oracle merge into 的效率问题的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 使用MERGE INTO 语句更新数据

Oracle 使用MERGE INTO 语句更新数据

Oracle中Merge into用法总结

Oracle基础之Merge into

merge into using 详解

Oracle merge into的优势