oracle merge 效率慢,更新语句的效率比较(merge into )
昨晚更新了一批數據,用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;???? ---注:為什么要寫這個羅嗦的條件呢?因為沒有這個條件就把整個表的數據全部更新了,因此必須寫,所以大家應該多實踐,不要被一些表面現象所蒙蔽。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的oracle merge 效率慢,更新语句的效率比较(merge into )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net 开发怎么实现前后端分离_ASP
- 下一篇: 我的原创,思考写作时间在1小时以上,希望