以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 ...
随机推荐
- PyQt5中的窗口显示控制
setWindowState(state) #设置窗口状态 Qt.WindowNoState 无状态-正常状态 Qt.WindowMinimized 最小化 Qt.WindowMaximized 最大 ...
- objc_object 与 NSObject
objc_object 与 NSObject:同一个事物的不同表现形式.
- pom.xml中使用“import”的scope来解决Maven项目单继承问题
测试环境 maven 3.3.9 想必大家在做SpringBoot应用的时候,都会有如下代码: <parent> <groupId>org.springframework.bo ...
- Traefik 2.0 发布了
Traefik 2.0 发布了,包含了很多不错的行特性 tcp 路由(同时也支持sni 路由) 参考配置 tcp: routers: to-db-1: entrypoints: - web-secur ...
- CCF 201909-5 城市规划
试题编号: 201909-5 试题名称: 城市规划 时间限制: 3.0s 内存限制: 512.0MB 问题描述: 几乎是Gym102222G的原版,详解见上一篇博文 /* 贡献+树形dp+01背包 * ...
- 假设检验总结以及如何用python进行假设检验(scipy)
几种常见的假设检验总结如下: 假设检验名称 Z检验 t检验 χ2检验 F检验 原假设 H0: μ≥μ0 H0: μ≤μ0 H0: μ=μ0 (比较样本和总体均值) ...
- 统计学基础知识(二)---推断统计学(Inferential Statistics)
推断统计学(Inferential Statistics):利用样本信息对总体进行估计和假设检验. 总体(population):在一个特定研究中所有感兴趣的个体组成的集合. 样本(sample):总 ...
- <转>python列表、元组、集合、字典、json相互转换以及其他基础入门
列表元组转其他 # 列表转集合(去重) list1 = [6, 7, 7, 8, 8, 9] set(list1) # {6, 7, 8, 9} #两个列表转字典 list1 = ['key1','k ...
- vuex实现登录状态的存储,未登录状态不允许浏览
基础思路就是使用vuex状态管理来存储登录状态(其实就是存一个值,例如token),然后在路由跳转前进行登录状态的判断,可以使用vue-router的全局前置守卫beforeEach,也可以使用路由独 ...
- windows内核代码之进程操作
[toc] 一丶简介 整理一下windows内核中.常用的代码.这里只整理下进程的相关代码. 二丶 windows内核之遍历进程 内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即 ...