merge更新或插入同一张表

简介: 一段业务逻辑,需要先判断一条记录在数据库中是否有存在,若存在则更新该记录,若不存在则插入记录。应用之前的做法是:1、先用条件判断记录在数据库中的个数。
一段业务逻辑,需要先判断一条记录在数据库中是否有存在,若存在则更新该记录,若不存在则插入记录。
应用之前的做法是:
1、先用条件判断记录在数据库中的个数。
2.1、若count(*)>0,则执行UPDATE操作。
2.2、若count(*)=0,则执行INSERT操作。

1、先插入记录。
2.1、若报ORA-001主键错误,则存在记录,此时执行UPDATE操作。
2.2、若无报错,认为插入完成。

以上两种方法,我认为都可以实现这种业务逻辑,区别在于第二种方法可能只需要一次SQL操作,前提是大部分记录都不存在,如果大部分操作都是UPDATE操作,可以这么改:
1、先更新。
2.1、若更新条数>0,则存在记录,执行完成。
2.2、若更新条数=0,则不存在记录,执行INSERT操作。

以上逻辑最差的情况就是需要执行两次SQL,如果数据量不大,则可以忽略消耗时间,但如果是大表,可能消耗就会翻倍。针对这种情况,或许可以考虑使用merge。一般使用merge都是用来将一个表数据导入另一个表,但他可以对同一个表操作,例如:
需求:RULE_COLLISION表:根据app_name、rule_id和start_time更新collision_count字段,或直接插入一条新的记录。
SQL
merge into RULE_COLLISION t1
using (SELECT 'TEST' app_name, 'TIMELIMIT_COMPONENT' MODULE, '规则一' RULE_ID, 3 COLLISION_COUNT, to_date('2014-07-21', 'yyyy-mm-dd') start_time from dual) t2
on (t1.app_name = t2.app_name AND t1.rule_id = t2.rule_id AND t1.start_time = t2.start_time)
when matched then
     update SET t1.collision_count = t2.collision_count
when not matched then
     insert values (t2.app_name, t2.MODULE, t2.RULE_ID, t2.COLLISION_COUNT, t2.start_time);


通过伪表dual,实现RULE_COLLISION表的自我更新或插入,这种做法和上面逻辑都是相同的,但这样只会执行一次SQL,如下是执行计划:

Execution Plan
----------------------------------------------------------
Plan hash value: 3989089639
-----------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------
|   0 | MERGE STATEMENT                |                          |     1 |   322 |     2   (0)| 00:00:01 |
|   1 |  MERGE                         | RI_RULE_COLLISION_DETAIL |       |       |            |          |
|   2 |   VIEW                         |                          |       |       |            |          |
|   3 |    NESTED LOOPS OUTER          |                          |     1 |   224 |     2   (0)| 00:00:01 |
|   4 |     FAST DUAL                  |                          |     1 |       |     2   (0)| 00:00:01 |
|   5 |     TABLE ACCESS BY INDEX ROWID| RI_RULE_COLLISION_DETAIL |     1 |   224 |     0   (0)| 00:00:01 |
|*  6 |      INDEX UNIQUE SCAN         | RULE_COLLISION_ID        |     1 |       |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   6 - access("T1"."APP_NAME"(+)='GALT' AND "T1"."RULE_ID"(+)='规则一' AND "T1"."START_TIME"(+)=TO_DATE(' 2014-07-21 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

Note
-----
   - dynamic sampling used for this statement (level=2)

Statistics
----------------------------------------------------------
          0  recursive calls
          3  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        829  bytes sent via SQL*Net to client
       1315  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

这里用到的是NESTED LOOPS OUTER,不是HASH JOIN,如果是两表操作是否就不同了?这块后面还需要实验研究下,有高手可以请教请教!
目录
相关文章
|
人工智能 弹性计算 搜索推荐
打造个性化的微信公众号AI小助手:从人设到工作流程
在数字化时代,一个有个性且功能强大的AI小助手能显著提升用户体验。本文档指导如何在微信公众号上设置AI小助手“小智”,涵盖其人设、功能规划及工作流程设计,旨在打造一个既智能又具吸引力的AI伙伴。
992 0
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
从平凡到非凡:借AI风口普通人如何起飞?
雷军曾说:“站在风口上,猪也能飞上天。”而AI无疑是当前最强劲的风口。本文介绍了如何抓住AI时代的机遇,包括理解AI基础概念、选择合适的AI工具、将AI融入工作提升效率,以及利用AI创造被动收入。通过这些步骤,你将能够在AI浪潮中获得成功。
509 0
从平凡到非凡:借AI风口普通人如何起飞?
|
人工智能 算法 安全
AI与未来医疗:革命性的变化与挑战
本文探讨了人工智能在医疗领域的应用及其带来的革命性变化。通过对当前AI技术在医疗诊断、治疗和预防方面的应用案例的分析,揭示了AI在未来医疗中的潜力和面临的伦理及技术挑战。最后,本文呼吁更多的跨学科合作,以推动AI在医疗健康领域的健康发展。
|
缓存 数据挖掘 大数据
阿里云服务器通用算力型u1与经济型e实例详细对比与选择参考
在阿里云丰富的云服务器实例规格中,通用算力型u1和经济型e实例的云服务器相对于其他实例规格来说,活动价格相对更低的两个云服务器实例,由于经济型e实例是共享型实例规格,而通用算力型u1实例是独享型实例规格,因此,有的用户比较关心阿里云通用算力型u1云服务器怎么样?本文将为您介绍这两款云服务器的区别、性能特点、适用场景及价格对比,为用户的选购决策提供全面参考。
阿里云服务器通用算力型u1与经济型e实例详细对比与选择参考
|
人工智能 云栖大会
2024云栖大会,我们来了!
2024云栖大会亮点介绍
699 1
|
安全 网络架构
什么是 ESS?
【8月更文挑战第24天】
2053 0
|
机器学习/深度学习 人工智能 自然语言处理
深度学习的突破与挑战:探索未来技术前沿
本文深入探讨了深度学习领域的最新进展、面临的主要挑战以及未来的发展趋势。文章首先介绍了深度学习的基本概念和应用领域,然后详细分析了当前深度学习技术的关键问题,包括数据依赖性、模型泛化能力、计算资源需求等。最后,文章展望了深度学习的未来发展方向,如模型可解释性、小样本学习、跨模态学习等,旨在为读者提供对深度学习领域全面而深入的理解。
|
人工智能 安全 自动驾驶
人工智能浪潮下的隐私保护:挑战与策略
本文旨在探讨人工智能技术发展对个人隐私保护所带来的挑战,并提出相应的应对策略。通过分析当前人工智能应用中数据收集和处理的常见模式,揭示其对个人隐私的潜在威胁。同时,结合最新的法律法规和技术手段,提出一系列隐私保护措施,旨在平衡技术创新与个人权益的保护。
619 0
|
Oracle 关系型数据库 索引
|
前端开发 JavaScript 程序员
如何做好IT类的技术面试
如何做好IT类的技术面试