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总数据量达到一定量时,该语句执行就特别慢,即使源数据量较小
请问为什么,该如何解决呢
你把这条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 的效率问题的主要内容,如果未能解决你的问题,请参考以下文章