昨晚更新了一批数据,用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 )相关推荐

  1. oracle 分页语句效率高,Oracle 10g SQL分页查询语句和效率分析

    下面统计一下这张表中的记录数: SQL> select count(*) from customers; COUNT(*) ---------- 55500 已用时间:  00: 00: 00. ...

  2. Oracle SQL:update更新语句总结

    update语句总结 update SQL用途: 用于修改表中的数据 语法: UPDATE 表名称 SET 列名称 = 新值 <WHERE 条件> 注意事项: ①.更新数字列则可以直接提供 ...

  3. mysql数据库更新语句效率_MySQL数据库优化

    一.常用查询 1.1 查询链接MySQL服务器的次数 mysql> show status like 'connections'; +---------------+-------+ | Var ...

  4. 【初级C语言】表达式和基本语句(布尔型与0比较,浮点型与0比较,switch语句,提高循环语句的效率)

    一.运算符的优先级 1.如果代码行中的运算符比较多,要用括号确定表达式的操作顺序.以防止产生歧义并提高可读性. 2.即使掌握了各个运算符的运算规则(顺序,结合性等)仍可能写出一个不能确定唯一计算路径的 ...

  5. php和 sqlserver效率,SQLServer语句执行效率及性能测试

    写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务器的响应时间有多快,这个时候就需要用到SQL的STATISTICS状态值来查看了. 通过设置STATISTICS我们可以查看执行SQL时的 ...

  6. 一个关于Oracle更新语句引发的时间字段类型的问题

    想当初我在做一个ASP.NET网站的时候,用的是Oracle数据库更新数据.表里面的字段有int类型的,string类型的,还有date类型的,在和asp.NET前台控件绑定更新的时候总是出现问题,我 ...

  7. oracle菜鸟学习之 复杂的更新语句使用

    oracle菜鸟学习之 复杂的更新语句使用 实例与答案 问题:表T1里有a,b,c...N个字段,表T2里有a,b,c三个字段,然后想在T1中"c"与表T2中"c&quo ...

  8. mysql 执行效率命令_MySQL优化--explain 分析sql语句执行效率

    MySQL优化--explain 分析sql语句执行效率 explain 命令 explain 命令在解决数据库性能上市第一推荐使用命令,大部分的性能问题可以通过此命令来简单解决,explain可以用 ...

  9. C++循环语句的效率

    C++循环语句的效率 C++/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用.本节重点论述循环体的效率.提高循环体效率的基本办法是降低循环体的复杂性. [建议4-4-1]在多 ...

最新文章

  1. 大家都能读懂的IT生活枕边书
  2. iOS最好用的引导页
  3. java缺_java – 缺少主类
  4. Docker4Dev #6 使用 Windows Container 运行.net应用
  5. pytorch学习笔记(三十九):Fine-Tuning
  6. 提示microsoft incremental linker已停止工作解决方法
  7. 面试题之TCP三次握手和四次挥手详解
  8. 倡议书格式范文_倡议书写作格式及范文(共9篇)
  9. oracle 临时表空间的作用和创建以及相关操作
  10. css直角线_CSS秘密花园:折角效果
  11. 关于图片的Exif信息
  12. vue 获取当前本机ip_Vue项目启动时自动获取本机IP地址
  13. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper.........[已解决]
  14. 《漫画英国》的读书笔记感想4069字
  15. NVDIMM在闪存存储中的应用探讨
  16. win10+python开发django项目day03
  17. R语言并行计算spearman相关系数
  18. 中富金石马力老师:2022年中央一号文件发布 时隔多年重提加强粮库建设
  19. 【财务_会计1_3】会计基本假设与会计基础
  20. android录音波浪动画_Android自定义View实现波浪动画

热门文章

  1. 列表、字典补充点、strJoin方法、set()集合、和深浅拷贝
  2. OpenGL ES入门
  3. C#使用HTML文件中的file文件上传,用C#代码接收上传文件
  4. MySQL Cluster 4个数据节点压力测试--mysqlslap工具压400W写
  5. 计算机网络——因特网的接入技术
  6. Leetcode--102. 二叉树的层次遍历
  7. 用python设计学生管理系统_基于python和tkinter实现的一个简单的学生信息管理系统...
  8. java7 uri,细数Java8中那些让人纵享丝滑的文件操作
  9. java 数据类型 string_java的基本数据类型和引用数据类型都有哪些,string属于什么类型...
  10. 判别分析分为r型和q型吗_电流互感器天天见,但是你真正了解和知道它的一些注意事项吗?...