问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

merge into效率问题

发布网友 发布时间:2022-04-13 12:35

我来回答

2个回答

懂视网 时间:2022-04-13 16:57

昨晚更新了一批数据,用update的老办法耗时20多分,而用mergeinto不到2秒结束,效率真是天壤之别。具体见下:用T_TMP_SCHOOL(135868行)的BIRTH字段更新T_TMP_N

昨晚更新了一批数据,用update的老办法耗时20多分,而用 merge into 不到2秒结束,效率真是天壤之别。具体见下:

用T_TMP_SCHOOL(135868行)的BIRTH 字段更新T_TMP_NT_CUSTOMERDETAIL( 763119行) 的BIRTHDATE 字段,连接条件 T_TMP_SCHOOL.ID = t_tmp_nt_customerdetail.SCHOOLID

--表结构
create table T_TMP_NT_CUSTOMERDETAIL
(
CUSTOMERID VARCHAR2(15) not null,
DOCCATEGORY VARCHAR2(2) not null,
DOCNUMBER VARCHAR2(20) not null,
BIRTHDATE VARCHAR2(8),
...........
SCHOOLID VARCHAR2(60)
);

create table T_TMP_SCHOOL
(
ID VARCHAR2(20),
COMPANY VARCHAR2(100),
NAME VARCHAR2(20),
BIRTH VARCHAR2(20)
);

--两个表的数据见下:
select count(1) from t_tmp_nt_customerdetail t; --763119
select count(1) from t_tmp_school; --135868

--为了验证结果,测试前先清空birthdate的值,网站空间,共更改 135879 行
update t_tmp_nt_customerdetail t
set t.birthdate = null
where t.schoolid is not null;

---实现的过程:
create or replace procedure p_tmp_update_customerdetail
is
v_BeginTran INT := 0; -- 事务标志,初始值为0,香港空间,表示没有事务
v_ErrCode INT;
v_ErrMsg VARCHAR2(200); -- 处理异常变量

begin
-- 设置事务标志为1,表示开始事务
v_BeginTran := 1;

merge into t_tmp_nt_customerdetail t
using (select b.id, b.birth from t_tmp_school b where b.birth is not null) a
on (t.schoolid = a.id)
when matched then
update set t.birthdate = a.birth where t.schoolid is not null;

COMMIT;
-- 提交事务并且置事务标志为0。
v_BeginTran := 0;

EXCEPTION
WHEN OTHERS THEN
-- 如果异常,回滚事务。
IF v_BeginTran = 1 THEN
ROLLBACK;
END IF;
v_ErrCode := SQLCODE;
v_ErrMsg := SUBSTR(SQLERRM, 1, 150);
dbms_output.put_line(v_ErrCode);
dbms_output.put_line(v_ErrMsg);
end;

--执行过程,用时1.11秒
SQL> exec p_tmp_update_customerdetail;

--再次验证结果,先前清空birthdate的值已经有了,返回 135879 行
select count(1) from t_tmp_nt_customerdetail t
where t.schoolid is not null
and t.birthdate is not null;

--而用下面类似的语句,这些数据执行了24分钟多:
update t_tmp_nt_customerdetail t
set t.birthdate = (select b.birth
from t_tmp_school b
where t.schoolid = b.id)
where t.schoolid =
(select c.id from t_tmp_school c where t.schoolid = c.id)
and t.schoolid is not null; ---注:为什么要写这个罗嗦的条件呢?因为没有这个条件就把整个表的数据全部更新了,因此必须写,虚拟主机,所以大家应该多实践,不要被一些表面现象所蒙蔽。

本文出自 “srsunbing” 博客,请务必保留此出处

热心网友 时间:2022-04-13 14:05

insert和update分开做:ns
1、insert的替代方案
WITH Tally (n) AS
(
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.all_columns a CROSS JOIN sys.all_columns b
)
INSERT INTO #Source
SELECT CASE WHEN n <= 500000 THEN 2*n-1 ELSE 2000000+n END
,1+ABS(CHECKSUM(NEWID()))%1000
FROM Tally;

2、update的替代方案:
WITH Tally (n) AS
(
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.all_columns a CROSS JOIN sys.all_columns b
)
INSERT INTO #Source
SELECT 2*n
,1+ABS(CHECKSUM(NEWID()))%1000
FROM Tally;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请问哪位大哥“谨谢不敏”是什么意思? 小女子尽谢不敏什么意思 谨谢不敏是什么意思? 敬谢不敏是是什么意思? 谢不敏的意思是什么 谢不敏词语解释 什么叫“谢不敏”? 6岁儿童晚上睡眠不好怎么办 六岁孩子精神异常怎么办 小程序开发需要什么技术 没有技术如何开发小程序 菏泽有人用过约克的中央空调吗,怎样?都是哪家公司安装的? 求word2003电脑版的安装包,急求, 在哪里下载Word 2000的完整安装包? QQ游戏里五子棋怎么玩才能成高手 五子棋中瑞星开局是必胜吗? QQ游戏五子棋 五子棋怎样成高手 如何成为下五子棋的高手 求五子棋能战胜对手的秘籍! 五子棋有神之一招 步步高ViVO全智能手机是什么系统的 vivo智能手机是什么系统 提问vivo智能手机是使用什么系统的智能手机? vivo用的是什么系统?? vivo手机是什么系统 vivo是什么系统的手机 关于深蹲翘臀的问题 要练弹跳.深蹲一天要做几组才有效? 做深蹲跳的正确姿势是什么呢? 螃蟹步深蹲跳怎么做视频? 习俗的意思是什么 风俗是指什么 卢克·凯奇 1-2季全集高清完整版视频免费在线观看,求百度网盘资源_百度... 喜欢的话请响铃电视剧在哪看? 《恶魔城 第一季》免费在线观看完整版高清,求百度网盘资源 被人多次举报一定会被封号吗? 柴火鸡酱料制作配方? 柴火鸡怎么做 作文要求:1。写出你感谢谁为什么感谢。 2。写出一件具体事例,表达你感谢的心情。 3。400左右。 感谢妈妈的感谢信的作文怎么写400字 感谢父母为你做的一件事作文400字(写信格式) 求一篇400字感谢信 UG调用DLL时失败出现ufusr怎么处理 W7 64位 UG7.5 无法加载图像 为什么比 update语句执行性能好这么多 UG进玉打不开 说什么功能名ufusr UG调用DLL时失败出现ufusr怎么处理? 十万火急!!!ug3.0用gearwizard模块怎么总是出错啊!!! ug创建箱体提示无法加载图像 UG10.0出EXCEL程序单失败显示函数名ufusr 很急、很急、很急、求告知!!!