以A表中的值快速更新B表中记录的方法
1、问题描述
有两张表,A表记录了某些实体的新属性,B表记录了每个实体的旧属性,现在打算用A中的属性值去更新B中相同实体的旧属性,如下图所示:
类似这样的需求,怎样做比较高效呢?
2、制作模拟数据
为了便于说明及进行效率对比,首先我们来制作一些模拟数据。在ORACLE数据库中,模拟数据的制作分如下三步:
- 创建数据表
create table a (tbbh number,dlbm varchar2(3));
create table b (objectid number,tbbh number,dlbm varchar2(3));
- 制作模拟数据,A表插入10000行记录,B表插入100000行记录
insert into a select rownum tbbh ,dbms_random.string('U',3) from dual connect by level <10000;
insert into b select rownum objectid ,rownum tbbh ,dbms_random.string('U',3) from dual connect by level <100000;
commit;
- 查看实体的原始属性值与目标属性值
3、常规解决办法
常规解决思路:从A表中每读出一条记录,去B表更新对应实体的属性值。用一段存储过程来模拟这个问题为:
begin
for x in (select tbbh,dlbm from a)
loop
update b set b.dlbm=x.dlbm where b.tbbh=x.tbbh;
end loop;
commit;
end;
在B表TBBH字段未创建索引的情况下,耗时约17.95s。
在B表TBBH字段创建索引的情况下,耗时约1.18s。
4、优化解决办法
常规办法是逐条进行更新,那可不可以进行批量的更新呢?答案是肯定的。我们可以这样操作。
- 在A表的TBBH字段上创建主键约束
alter table a add primary key (tbbh) using index;
- 对A、B表的联合视图进行更新
update (select b.tbbh ,a.dlbm adlbm ,b.dlbm bdlbm from a,b where a.tbbh=b.tbbh ) set bdlbm=adlbm;
使用该方法,在B表TBBH字段未创建索引的情况下,耗时约0.96s。
使用该方法,在B表TBBH字段创建索引的情况下,耗时约0.54s。
5、效率对比
B表TBBH无索引 |
B表TBBH有索引 |
|
常规方法 |
17.95s |
1.18s |
优化方法 |
0.96s |
0.54s |
很显然,优化后的方法,其性能有较大程度的提升。
以A表中的值快速更新B表中记录的方法的更多相关文章
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
- 3-java中String值为空字符串与null的判断方法
java中String值为空字符串与null的判断方法 2018年01月21日 14:53:45 阅读数:1189 Java空字符串与null的区别 1.类型 null表示的是一个对象的值,而不是一个 ...
- mysql 动态拼接表字段,值 mybatis 动态获取表字段
-- 取表所有字段,自动用逗号分开 select GROUP_CONCAT(DISTINCT COLUMN_NAME) from information_schema.columns where ta ...
- layui从url中取值 ajax获取当前链接中的变量
在使用layui(javascript)的时候, 需要从当前页面的url地址中取值, 例如: http://localhost:8081/html/fund-purchase.html?fundID ...
- 利用ROWID 快速更新单表记录
-----对于普通表 实现: UPDATE T_PM_DEPOSIT_HIS b SET flag = SUBSTR( flag, 1, 8 )||'4'|| CASE WHEN term <= ...
- 当数据库某张表数据发生变化时,更新c#程序中缓存的用法
参考:http://www.webkaka.com/tutorial/asp.net/2012/111912/(SqlDependency和SqlCacheDependency缓存的用法及具体步骤) ...
- Android中使用异步线程更新UI视图的几种方法
在Android中子线程是不能更新ui的. 所以我们要通过其他方式来动态改变ui视图, 1.runOnUiThreadactivity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要 ...
- Linux中使用Vim快速更换文档中Windows换行符为Linux平台
一.简述 平时我们把Windows编写好的sh文件放在linux上跑时,经常出现换行符的问题.快速切换的解决方法如下: 二.解决 vim test.sh :set ff? 如果出现fileforma= ...
- jsp如何判断mysql数据库中是否已经存在添加的某条记录的方法
String query="select * from hdxcy_info where XcyName='"+XcyName+"'"; String sqlS ...
随机推荐
- 伯克利套接字(BSD Socket)
http://blog.csdn.net/blueman2012/article/details/6693605#socket.28.29 伯克利套接字(Berkeley sockets),也称为BS ...
- python-hashlib加密
用于加密相关的操作,代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA512,MD5算法. 以下是算法示例: #!/usr/bin/env python # -*- c ...
- SparkStreaming消费kafka中数据的方式
有两种:Direct直连方式.Receiver方式 1.Receiver方式: 使用kafka高层次的consumer API来实现,receiver从kafka中获取的数据都保存在spark exc ...
- OpenCV 学习笔记(10)HSV颜色空间及颜色空间转换(RGB-HSV)
1.1 颜色空间介绍 RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成.然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色 调 H ...
- 华三IRF配置
配置步骤: IRF的配置步骤: 1.配置IRF域(域ID=10.成员ID.优先级) irf domain 10irf member 1 priority 10irf member 2 priority ...
- UFUN函数 UF_ASSEM UF_PART函数(UF_ASSEM_ask_work_part,UF_PART_ask_part_name)
UF_initialize(); tag_t work_part_tag=NULL_TAG; ]=""; //获取当前工作部件的tag work_part_tag=UF_ASSEM ...
- SQL练习题 51题 一刷
Student表: select * from student; 课程表Course: select * from course; 教师表teacher: select * from teacher; ...
- Falcor 学习一基本使用
falcor 是netflix 公司为了解决自己api数据查询所开发的查询框架,很不错(尽管netflix 也在用graphql )以下是falcor 的 一个简单使用,基于express 框架,使用 ...
- 总结TCP与UDP的区别
TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认.窗口.重传.拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源. TCP的缺 ...
- A@[G!C]%008
A@[G!C]%008 A Simple Calculator 细节题. B Contiguous Repainting 最后只要有连续\(K\)个鸽子同色就可以构造方案,枚举+前缀和 C Tetro ...