`
weiwuwen
  • 浏览: 41878 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle多表关联update优化

阅读更多
       我们都知道,在Oracle数据库中,对单表进行更新采用标准update语法效率是非常高的,语法为UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,如下SQL所示: 
update t_join_situation set join_state = '1' where year='2011'
      如果涉及关联表,并把一个表的字段值更新到另一个表中的字段去,采用以上更新方式,语句通常这样写: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),如下SQL所示:
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')
where exists (select 1 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')
       但是,这样更新的效率是非常低的。

       这里,推荐几种多表关联update优化的方式:

      (1)inline view 更新法

       inline view更新法就是更新一个临时建立的视图。如:
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
       括号里通过关联两表建立一个视图,set中设置好更新的字段。这个解决方法比写法较直观且执行速度快。但表B的主键一定要在where条件中,并且是以“=”来关联被更新表,否则报一下错误:
         
        (2)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); 
       例如:       
MERGE INTO T_SUPERVISE_REPORT T
USING (SELECT A.UUID, A.SUPERVISETYPE, A.IMGID, A.LASTVALUE
         FROM T_SUPERVISE_REPORT_TMP A) S
ON (T.UUID = S.UUID AND T.SUPERVISETYPE = S.SUPERVISETYPE AND T.IMGID = S.IMGID)
WHEN MATCHED THEN
  UPDATE SET T..LAST_VALUE= S.LASTVALUE;
        它的原理是在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。执行merge不会返回影响的行数。Merge语句的写法比较繁琐,并且最多只能两个表关联,复杂的语句用merge更新法将力不从心且效率差。

      (3)快速游标更新法

        语法如: 
begin
for cr in (查询语句) loop –-循环
   --更新语句(根据查询出来的结果集合)
end loop; --结束循环
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;
end loop;
end;

       使用快速游标的好处很多,可以支持复杂的查询语句,更新准确,无论数据多大更新效率仍然高,但执行后不返回影响行数。

       结论:       

方案

建议

标准update语法

单表更新或较简单的语句采用使用此方案更优。

inline view更新法

两表关联且被更新表通过关联表主键关联的,采用此方案更优。

merge更新法

两表关联且被更新表不是通过关联表主键关联的,采用此方案更优。

快速游标更新法

多表关联且逻辑复杂的,采用此方案更优。

       参考资料:百度【Oracle的update的五种方式】

  • 大小: 9.9 KB
分享到:
评论

相关推荐

    ORACLE_多表关联_UPDATE_语句

    Oracle数据库中的多表关联UPDATE语句是用于在一个表中更新数据时,依据另一个表的条件进行操作的关键技术。这在处理复杂的数据同步或修正场景时非常有用。在本例中,我们将探讨如何利用多表关联来更新数据,并通过...

    ORACLE多表关联的update语句

    总结,Oracle的多表关联UPDATE语句是一种强大的工具,能够有效处理跨表的数据更新需求,确保数据的一致性和准确性。在实际应用中,应根据业务逻辑和数据关系选择最适合的更新方法,并进行充分的测试以确保其正确性和...

    Oracle中多表关联批量插入批量更新与批量删除操作

    总的来说,理解并熟练掌握Oracle中多表关联的批量插入、更新和删除操作,能够有效优化数据库性能,提高开发效率,并且减少因频繁的单条操作导致的错误可能性。在设计数据库方案时,应充分利用这些特性,为应用程序...

    update语句的优化-oracle .pdf

    当更新操作涉及到多表关联且逻辑较为复杂时,可以使用PL/SQL的游标(cursor)来进行逐行处理。通过for循环遍历游标中的数据,可以在循环体中执行具体的更新操作。例如: ```sql BEGIN FOR cr IN ( SELECT a....

    oracle的update的五种方式

    这种方式比标准 Update 语句更灵活,可以关联多个表,并且执行速度快。但是,表 B 的主键必须在 where 条件中,并且是以“=”来关联被更新表,否则将报错。 三、Merge 更新法 Merge 更新法是 Oracle 特有的语句,...

    对Oracle多表关联更新的应用研究.pdf

    Oracle数据库在多表关联更新中的应用研究主要集中在如何高效、准确地处理复杂的数据操作,尤其在涉及多个表之间关系的数据更新场景。在这个案例中,研究背景是一家名为仪刘鑫梓的大型百货连锁销售公司,该公司正在...

    ORACLE_UPDATE_语句语法与性能分析

    2) **两表关联UPDATE**: 在这种形式中,我们使用EXISTS子句与一个临时表(tmp_cust_city)进行关联。这允许我们仅更新那些在临时表中存在的记录。这种方式更安全,因为它不会误更新不匹配的数据。同时,由于我们只...

    ORACLE UPDATE 语句语法与性能分析看法

    - **索引优化**:合理设计和维护索引,尤其是复合索引,可以显著提高`UPDATE`操作的效率,尤其是在多表关联的情况下。 - **批处理更新**:对于大量数据的更新,考虑使用批处理技术,如通过循环或批处理`UPDATE`语句...

    Oracle 11i 表结构

    3. **多对多**:两个表之间存在多对多的关系时,通常会引入第三个表(关联表)来连接它们,该关联表中包含两个表的主键作为其外键。 #### 四、触发器的设置 触发器是一种特殊类型的存储过程,它被定义为当特定事件...

    SQL update 多表关联更新的实现代码

    这里我们将探讨如何使用SQL `UPDATE` 语句来实现多表关联更新,特别关注标题和描述中提到的例子。 首先,我们有两个表:A表和B表,它们都有一个共同的字段 `c1`。A表的记录包括 `(1, a1)`, `(2, a2)`, `(3, a3)`, `...

    Oracle数据库优化培训.ppt

    本次培训主要围绕SQL语句的执行过程、Oracle优化器、表之间的关联、获取SQL执行计划以及如何分析执行计划等核心内容展开。 首先,理解SQL语句的执行过程至关重要。SQL语句包括查询语句、DML语句(INSERT、UPDATE、...

    Oracle 词汇表

    Oracle 词汇表是数据库管理员和开发人员在使用Oracle数据库系统时必须掌握的重要工具。Oracle数据库是全球广泛应用的关系型数据库管理系统,其英文界面对于非母语使用者可能会带来理解困难。因此,掌握Oracle 词汇表...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    6.3 表关联顺序的hint 125 6.3.1 leading hint 125 6.3.2 ordered hint 126 6.4 表关联操作的hint 127 6.4.1 use_hash,use_nl和use_merge hint 127 6.4.2 no_use_hash hint 132 6.4.3 no_use_merge hint 133 6.4.4 ...

    oracle表空间权限

    多表关联更新是数据库操作中的常见需求,特别是当数据分布在多个表中时。通过JOIN操作,可以从多个表中提取和更新数据。例如,如果你有两个相关表A和B,你可以使用以下SQL语句进行联合更新: ```sql UPDATE A JOIN ...

    oracle自增长与临时表

    2. **使用临时表**:在会话中,你可以像操作普通表一样对临时表进行INSERT、UPDATE和SELECT等操作。但请注意,不同会话之间无法看到彼此的临时表数据。 3. **生命周期**:临时表的生命周期与会话关联,会话结束时,...

    Oracle数据库优化培训.pptx

    本篇文章主要介绍 Oracle 数据库优化的相关知识,涵盖了 SQL 语句执行过程、ORACLE 优化器、表之间的关联、如何得到 SQL 执行计划、如何分析执行计划等内容。 SQL 语句执行过程 SQL 语句处理的基本过程包括查询...

    Oracle触发器备份表数据

    触发器是一种存储过程,它与表或视图关联,并在对这些对象执行特定类型的数据库操作(如INSERT、UPDATE、DELETE)时自动执行。触发器可以在数据修改前或后执行,这为实现复杂业务逻辑提供了强大的支持。 #### 如何...

    activity-oracle建表SQL

    在Oracle数据库系统中,"activity-oracle建表SQL"指的是创建活动相关数据表的SQL语句...在实际工作中,根据业务需求,可能还需要设计更复杂的表结构,如多对一、一对多、多对多关系,以及考虑性能优化、安全性等因素。

Global site tag (gtag.js) - Google Analytics