update语句的语法与原理

update语句的优化-oracle .pdf 实际项目中遇到的问题总结:数据量百万级,千万级。Oracle中update语句的优化,一共四种方案,工作中遇到该类问题可以参考。 立即下载

一、         update语句的语法与原理
1.     语法
单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
如:update t_join_situation set join_state='1'whereyear='2011'
更新年度为“2011”的数据的join_state字段为“1”。如果更新的字段加了索引,更新时会重建索引,更新效率会慢。
   多表关联,并把一个表的字段值更新到另一个表中的字段去:
update 表a set a.字段1 = (select b.字段1 from 表b where a.字段2=b.字段2) where exists(select 1 from 表b where a.字段2=b.字段2)  
oracle的更新语句不通MSSQL那么简单易写,就算写出来了,但执行时可能会报
这是由于set哪里的子查询查出了多行数据值,oracle规定一对一更新数据,所以提示出错。要解决这样必须保证查出来的值一一对应。
2.     原理
Update语句的原理是先根据where条件查到数据后,如果set中有子查询,则执行子查询把值查出来赋给更新的字段,执行更新。
如:update 表a set a.字段1 = (select b.字段1 from 表b where a.字段2=b.字段2) where exists(select 1 from 表b where a.字段2=b.字段2)。查表a的所有数据,循环每条数据,验证该条数据是否符合exists(select 1 from 表b where a.字段2=b.字段2)条件,如果是则执行(select b.字段1 from 表b where a.字段2=b.字段2)查询,查到对应的值更新a.字段1中。关联表更新时一定要有exists(select 1 from 表b where a.字段2=b.字段2)这样的条件,否则将表a的其他数据的字段1更新为null值。
二、         提高oracle更新效率的各种解决方案
1.     标准update语法
当你需要更新的表是单个或者被更新的字段不需要关联其他表带过来,则最后选择标准的update语句,速度最快,稳定性最好,并返回影响条数。如果where条件中的字段加上索引,那么更新效率就更高。但对需要关联表更新字段时,update的效率就非常差。
2.     inline view更新法
inline view更新法就是更新一个临时建立的视图。如:update (select a.join_state asjoin_state_a,b.join_state as join_state_b
from t_join_situation a, t_people_info b where a.people_number=b.people_number
and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') setjoin_state_a=join_state_b
括号里通过关联两表建立一个视图,set中设置好更新的字段。这个解决方法比写法较直观且执行速度快。但表B的主键一定要在where条件中,并且是以“=”来关联被更新表,否则报一下错误:
 
3.merge更新法
merge是oracle特有的语句,语法如下:
MERGE INTO table_name alias1 
USING (table|view|sub_query) alias2
ON (join condition) 
WHEN MATCHED THEN 
    UPDATE table_name 
    SET col1 = col_val1, 
        col2     = col2_val 
WHEN NOT MATCHED THEN 
    INSERT (column_list) VALUES (column_values); 
它的原理是在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。执行merge不会返回影响的行数。Merge语句的写法比较繁琐,并且最多只能两个表关联,复杂的语句用merge更新法将力不从心且效率差。
4.快速游标更新法
语法如:
begin
for cr in (查询语句) loop –-循环
   --更新语句(根据查询出来的结果集合)
endloop; --结束循环
end;
oracle支持快速游标,不需要定义直接把游标写到for循环中,这样就方便了我们批量更新数据。再加上oracle的rowid物理字段(oracle默认给每个表都有rowid这个字段,并且是唯一索引),可以快速定位到要更新的记录上。
例子如下:
begin
for cr in (select a.rowid,b.join_state from t_join_situation a,t_people_info b
where a.people_number=b.people_number
and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') loop
update t_join_situation set join_state=cr.join_state where
rowid = cr.rowid;
endloop;
end;
使用快速游标的好处很多,可以支持复杂的查询语句,更新准确,无论数据多大更新效率仍然高,但执行后不返回影响行数。
三、结论

方案
建议
标准update语法
单表更新或较简单的语句采用使用此方案更优。
inline view更新法
两表关联且被更新表通过关联表主键关联的,采用此方案更优。
merge更新法
两表关联且被更新表不是通过关联表主键关联的,采用此方案更优。
快速游标更新法
多表关联且逻辑复杂的,采用此方案更优。

 
 
实时测试的速度:
--48466条数据
--1.297
update (select a.join_state as join_state_a,b.join_state as join_state_b
from t_join_situation a, t_people_info b where a.people_number=b.people_number
and a.year='2011'and a.city_number='M00000'and a.town_number='M51000'
) set join_state_a=join_state_b
 
--7.156
update t_join_situation a set a.join_state=(select b.join_state from t_people_info b
where a.people_number=b.people_number
and a.year='2011'and a.city_number='M00000'and a.town_number='M51000')
whereexists (select1from t_people_info b
where a.people_number=b.people_number
and a.year='2011'and a.city_number='M00000'and a.town_number='M51000')
 
--3.281
begin
for cr in (select a.rowid,b.join_state from t_join_situation a,t_people_info b
where a.people_number=b.people_number
and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') loop
update t_join_situation set join_state=cr.join_state where
rowid = cr.rowid;
endloop;
end;
 
--1.641
mergeinto t_join_situation a
using t_people_info b
on (a.people_number=b.people_number
and a.year='2011'and a.city_number='M00000'and a.town_number='M51000')
whenmatchedthenupdateset a.join_state=b.join_state

ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合 本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。 阅读详情

相关推荐

计量经济学——事件研究法/事件分析法

计量经济学——事件研究法/事件分析法

weixin_46189461的博客 6754

update语句详解

update命令 语法: UPDATE表名SETcolumn_name=value [,column_name2=value2,...] [WHEREcondition]; 或者理解为:UPDATE 表名 SET 列名=VALUE WHERE [条件] 注意 : column_name 为要更改的数据列,尽量带上`` value 为修改后的数据 , 可以为变量 , 具体指 , 表达式或者嵌套的SELECT结果 例如:UPDATE `student` SET `b...

weixin_45746783的博客 15万+

汽车软件工程师必看:ASPICE流程实战指南(附完整产物清单)

本文为汽车软件工程师提供ASPICE流程实战指南,详细解析如何搭建合规开发环境、各阶段文档产出清单及工具链整合策略。通过实战案例和模板资源,帮助团队高效实施ASPICE标准,提升软件开发质量与效率。

weixin_29230805的博客 472

MySQL的UPDATE(更新数据)详解

本文将详细介绍Mysql的update语句的基本语法、高级用法、性能优化策略以及注意事项,帮助您更好地理解和应用这一重要的SQL命令

驴大毛的博客 1万+

Excel 汉字首字母提取:四种方案对比与选型

本文对比了 Excel 中提取汉字首字母的四种方案:手动转换、VBA 脚本、映射表与 AI 工具。手动方式低效易错;VBA 适合无网环境但识别范围有限;映射表精度提升却无法解决多音字;AI 工具通过语义理解可一句话完成提取,是多数场景下的首选。

u011186532的专栏 397

GRCNN抓取网络学习3【自制Jacquard数据集模型调优】

请先完成,这样有利于下面操作的理解!然后第二步是,有了自己的数据集输入到GRCNN中是三种文件,那么可以GRCNN抓取网络学习2【自制Jacquard数据集训练】!既然学会训练,那么开展下一步计划模型调优。GRCNN源码:https://github.com/skumra/robotic-grasping。

vor234的博客 2502

MySQL 中的 UPDATE 语句

表中的数据,可以更新单行或多行数据。可能影响多行数据,建议。语句就能又快又安全!开启事务(如果支持)

鸟人的博客 1万+

PINN:当深度学习遇上朗伯-比尔定律

光谱数据处理中引入PINN的三种架构设计

qq_53529450的博客 155

MySQL中update语法的使用(超详细)

在MySQL中,UPDATE语句用于修改已存在的表中的记录。以下是对UPDATE。

m0_71212744的博客 1万+

【我的Android进阶之旅】Android自定义View实现一个游戏摇杆,来实现监听遥动的方向或者监听摇动的角度的功能

一、需求描述 去年有个需求,需要使用自定义View实现一个游戏摇杆,来识别上下左右摇动的方向。 有点类似下面这样的王者荣耀游戏摇杆的效果 二、业界已有的参考资料 在下面这篇博客介绍了如何自定义游戏摇杆 2.1 博客介绍 Android自定义摇杆 2.1.1 功能 支持自适应大小 支持2个方向、4个方向、8个方向的摇动监听 支持摇动角度获取 可选回调模式 支持可摇动区域自定义 支持摇杆自定义 支持设置图片、色值、Shape图形 2.1.2 效果图 2.1.3 设置回调方式 setCallBac

字节卷动 1412

飞牛fnNAS存储模式RAID 5数据恢复

中介绍了fnNAS存储空间的几个模式,细心的网友应该能感受到,我是非常推崇RAID 5的。但我认为,一般人出现1块硬盘损坏后,就能够赶紧采取处理措施了,再高的容灾等级也无法满足这个用户的需求了。》就完成了飞牛NAS存储空间的说明,包括了如何创建、怎么选择空间模式、RAID 5 硬盘故障后的更换、系统更换/重装后数据盘的恢复等等。在VMware中新建虚拟机,安装好fnNAS后,再向虚拟机添加“已有硬盘”(这就是所谓崩溃虚拟机的数据盘),此时新的fnNAS出现提示。在“选择要添加的硬盘”中,选择刚添加硬盘。

dgnankai的专栏 3011

oracle的update语句优化

Oracle的update语句优化研究 一、         update语句的语法与原理 1.     语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation set join_state='1'whereyear='2011' 更新年度为“2011”的数据的join_state字

shena的专栏 2453

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Oracle的update语句优化研究

Oracle的update语句优化研究 一、         update语句的语法与原理 1.     语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation set join_state='1'whereyear='2011' 更新年度为“2011”的数据的join_state字段为

1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Oracle的update语句优化研究 批量更新

Oracle的update语句优化研究 一、 update语句的语法与原理 1. 语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation set join_state='1' where year='2011' 更新年度为“2011”的数据的join_state字段为“1”。如果更新的字段加了

DAO的博客 3万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

转发:Oracle的update语句优化研究 批量更新

Oracle的update语句优化研究 一、update语句的语法与原理 1.语法 单表:UPDATE 表名称 SET列名称 =新值 WHERE列名称 =某值 如:upd...

chezhengpi2527的博客 296

oracle设置优化update,oracle update优化

一、update语句的语法与原理1.语法单表:UPDATE表名称SET列名称=新值WHERE列名称=某值如:updatet_join_situationsetjoin_state='1'whereyear='2011'更新年度为“2011”的数据的join_state字段为“1”。如果更新的字段加了索引,更新时会重建索引,更新效率会慢。多表关联,并把一个表的字段值更新到另一个表中的字段去:upda...

weixin_42517607的博客 2290

oracle update 原理

Oracle的update语句优化研究 一、update语句的语法与原理 1.语法 单表:UPDATE表名称SET列名称=新值WHERE列名称=某值如:updatet_join_situationsetjoin_state='1'whereyear='2011' 更新年度为“2011”的数据的join_state字段为“1”。如果更新的字段加了索引...

weixin_30790841的博客 517

oracled update_oracle中update语句的性能优化

Oracleupdate语句的性能优化一、update语句的语法与原理1,语法单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值如:复制代码代码示例:update t_join_situation set join_state='1'whereyear='2011'更新年度为“2011”的数据的join_state字段为“1”。如果更新的字段加了索引,更新时会重建索...

weixin_32052253的博客 2435

MySQL 基础语法与索引优化全解析

本文系统介绍了MySQL核心语法与索引优化技巧。主要内容包括:1)SELECT语句基础与WHERE子句高级用法,涵盖条件过滤、排序分页和模式匹配;2)UPDATE语句及多表关联更新;3)索引原理与类型对比,分析普通索引、组合索引等适用场景;4)索引优化实践,提出高选择性列优先、组合索引顺序等设计原则,并列举常见失效场景的解决方案。文章强调,数据库优化需结合业务场景持续调整,建议后续深入学习多表查询、事务处理等高级主题,以全面提升MySQL应用能力。

pop_opo_的博客 908

PostgreSQL UPDATE 语句详解

PostgreSQL 的UPDATE语句用于修改表中现有的记录,是数据库操作中最重要的"增删改查"四大操作之一。UPDATE 可以精确控制要修改的数据行和列,支持条件更新和多列更新。掌握基础语法和高级用法理解UPDATE操作的执行原理学会性能优化技巧注意事务和并发控制遵循安全最佳实践通过合理应用UPDATE语句,可以高效安全地完成各种数据修改需求,为应用系统提供可靠的数据维护能力。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

MySQL UPDATE 语句:数据更新操作详解

在使用UPDATE语句时,需要注意正确编写更新条件和更新字段的内容,以确保更新操作的准确性和有效性。一旦找到匹配条件的记录,MySQL会根据UPDATE语句中指定的新值来更新这些记录的数据。在上面的语法中,table_name代表要更新数据的表名,column1 = value1, column2 = value2等表示要更新的字段及其新值,WHERE condition则指定更新的条件。用户可以根据具体的需求自定义UPDATE语句的内容,灵活地更新数据库中的数据。

2301_82236259的博客 881

把我坑惨的一个update语句!

来源:ju.outofmemory.cn/entry/336774最近好几次有开发同学在钉钉上问我,比如下图:问题归纳起来就是:在MySQL里面update一条记录,语...

Java技术栈,分享最主流的Java技术 1584

oracle千万行update优化,Oracle的update优化

Oracle的update语句优化研究一、 update语句的语法与原理1. 语法单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值如:update t_join_situation set join_state='1'whereyear='2011'更新年度为“2011”的数据的join_state字段为“1”。如果更新的字段加了索引,更新时会重建索引,更新效率会...

weixin_32259717的博客 2530
上一篇: postgreSQL 使用With字句的例子
下一篇: PostgreSQL基本调优知识,Update效率优化
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值