`
smartyidiot
  • 浏览: 18254 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Oracle数据库Merge Into 如何使用Sequence 而不“浪费”

 
阅读更多

1、问题背景:该问题是在做Data Stage时引出来的一个问题,必须使用Merge Into的时候会浪费很多NextVal。

2、测试前提:创建脚本。

-- 创建源表
create table sourceTest(
id int,
name varchar2(100),
seq_value int,
t_stamp date
);


-- 创建目标表
create table targetTest(
id int,
name varchar2(100),
seq_value int,
t_stamp date
);


-- 创建sequence
create sequence seq_test
minvalue 1
maxvalue 999999
increment by 1
cache 40
nocycle;


-- 添加测试数据
insert into sourceTest(id,name,t_Stamp) values(null,null,sysdate);
insert into sourceTest(id,name,t_Stamp) values(1,'one',sysdate - 1);
insert into sourceTest(id,name,t_Stamp) values(2,'two',sysdate - 2);
insert into sourceTest(id,name,t_Stamp) values(3,null,sysdate - 3);
insert into sourceTest(id,name,t_Stamp) values(null,'four',sysdate + 1);
commit;

 3、测试

merge into targetTest t
using (select id, name,seq_value,t_stamp from sourceTest) s
on (s.id = t.id and s.name = t.name)
when matched then
  update set t.seq_value = s.seq_value, t.t_stamp = sysdate
when not matched then
  insert (id, name, seq_value,t_stamp) values (s.id, s.name,test.seq_test.nextval,s.t_stamp);

  第一次执行,结果:

  

    ID NAME SEQ_VALUE T_STAMP
1   one 1 2012-11-17 下午 03:11:46
2     2 2012-11-18 下午 03:11:46
3 3   3 2012-11-15 下午 03:11:46
4   four 4 2012-11-19 下午 03:11:46
5 2 two 5 2012-11-16 下午 03:11:46

第二次执行,结果:

 

    ID NAME SEQ_VALUE T_STAMP
1 1 one   2012-11-18 下午 03:20:28
2     2 2012-11-18 下午 03:11:46
3 3   3 2012-11-15 下午 03:11:46
4   four 4 2012-11-19 下午 03:11:46
5 2 two   2012-11-18 下午 03:20:28
6     8 2012-11-18 下午 03:11:46
7 3   9 2012-11-15 下午 03:11:46
8   four 10 2012-11-19 下午 03:11:46

从上面的结果,我们可以非常清晰的看到6和7那里去了?--浪费掉了。

4、解决。创建一个函数来获取相应的值。

create or replace function get_sequence_nextval(f_schema in varchar2, f_sequence_name in  varchar2) return number
is
  v_nextval         number;
begin
  execute immediate 'select ' || f_schema || '.'||f_sequence_name||'.nextval from dual' into v_nextval;
 return v_nextval;
exception
  when others then
   raise_application_error(sqlcode,sqlerrm);
end;

 

 将3测试中的代码调整为:test.seq_test.nextval  ==> test.get_sequence_nextval('test','seq_test')

 再次调用,我们可以看到三条记录11、12、13已经紧跟着10了。--不浪费了。

 

    ID NAME SEQ_VALUE T_STAMP
1 1 one   2012-11-18 下午 03:28:35
2     2 2012-11-18 下午 03:11:46
3 3   3 2012-11-15 下午 03:11:46
4   four 4 2012-11-19 下午 03:11:46
5 2 two   2012-11-18 下午 03:28:35
6     8 2012-11-18 下午 03:11:46
7 3   9 2012-11-15 下午 03:11:46
8   four 10 2012-11-19 下午 03:11:46
9     11 2012-11-18 下午 03:11:46
10 3   12 2012-11-15 下午 03:11:46
11   four 13 2012-11-19 下午 03:11:46

 

 5、结论及分析:

使用Merge Into调用Sequence 类似于预编译,会直接将值赋组合相应的调用,而不管该matched 或 not matched是否成功执行。而使用一个function进行封闭以后,因为预编译时无法知道该值,所以不会进行预处理,因此也不会浪费sequence的值。但是,使用function来讲,会带来另外一个问题,性能因为无端的增加了一下调用。

所以,根据自己的实际情况,选择适合自己的才是最好的。

分享到:
评论

相关推荐

    浅谈Oracle数据库中Merge Into的用法.pdf

    Oracle 数据库中 Merge Into 的用法 在 Oracle 数据库中,Merge Into 语句是一种非常有用的功能,它主要用来合并 update 和 insert 语句,即用一个表中的数据来修 改或插入到另一个表中。Merge Into 语句的主要原则...

    Oracle中merge into的使用

    在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...

    oracle merge into的使用

    标题:Oracle Merge Into 的使用 描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为...

    oracle死锁原因解决办法

    在Oracle数据库系统中,死锁是一种常见的并发问题,它会导致多个事务之间互相等待对方释放资源而无法继续执行,最终导致整个系统的运行效率降低甚至停滞。死锁不仅影响数据库性能,还会影响应用程序的可用性和用户...

    Oracle merge into用法

    在Oracle数据库中,`MERGE INTO`语句是一种非常强大的工具,它允许用户根据源表中的数据更新目标表,同时也可以插入新记录。这一特性在处理大量数据时尤其有用,因为它能够在一个步骤中完成更新和插入操作,从而提高...

    Mybatis批量foreach merge into的用法

    首先,需要使用Oracle 9i及其以后版本支持的merge into语句,该语句可以实现insertOrUpdate的功能。然后,使用Mybatis的动态SQL语法foreach循环插入,待插入的实体bean的List通过查询数据库dual形成表。foreach的 ...

    Merge into的使用详解

    总结来说,`MERGE INTO`语句是数据库管理中的一个重要工具,尤其是在处理数据同步和更新时。熟练掌握`MERGE INTO`的用法,能够有效地提升数据处理的效率和准确性。通过实例,我们可以看到它如何根据不同的匹配情况...

    oracle中merge into用法及实例解析

    Oracle中的`MERGE INTO`语句是一种强大的工具,用于整合数据操作,如更新、插入和删除,基于两个数据源的匹配条件。这个语句在处理数据仓库、数据同步或者复杂业务逻辑时非常有用。让我们详细了解一下`MERGE INTO`的...

    oracle merge 用法详解

    自Oracle 9i版本开始,Oracle数据库引入了一个非常强大的SQL语句——`MERGE`命令。通过这个命令,用户可以在一个单一的SQL语句中完成对表的插入(`INSERT`)和更新(`UPDATE`)操作,极大地简化了数据处理流程并提高了...

    Merge Into 语句代替InsertUpdate

    非常经典的SQL经验,适合于数据库初学者及长期从事软件开发者

    利用 sqluldr2导出数据 使用sqlldr导入数据 通过merge into 合并更新数据

    在数据库管理领域,高效的数据导入导出以及合并更新是日常工作中不可或缺的部分。Oracle数据库提供了一套强大的工具,包括SQL*Loader(简称SQLLDR)和SQL Ultra Data Recorder 2(SQLULDR2),来帮助我们处理这些...

    Oracle_merge

    本文将详细介绍 Oracle 中 `MERGE` 关键字的使用方法,并结合实际示例来解析其工作原理。 #### 二、`MERGE` 语句的基本概念 在 Oracle 9i R2 版本之前,如果需要同时进行更新和插入操作,开发人员通常需要编写两条...

    oracle数据库性能调优(3)

    Oracle作为广泛使用的关系数据库管理系统(RDBMS),其性能调优尤为关键。本篇将继续深入探讨Oracle数据库性能调优的诸多方面,重点关注于嵌套循环执行计划,这是数据库多表操作中常见的连接方式之一。 首先,了解...

    oracle Merge 函数.doc

    Merge 函数的使用方式有三种:只更新不插入、只插入不更新和既插入也更新。 Merge 函数的基本用法 Merge 函数的基本语法结构为: ```sql MERGE INTO 目标表 USING 来源表 ON (条件) WHEN MATCHED THEN 更新操作 ...

    Oracle MERGE INTO的用法示例介绍

    如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 ...

    使用BULK COLLECT, MERGE 语句提高sql执行效率

    详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询

    Oracle11G数据库学习笔记

    这篇学习笔记主要涵盖了Oracle11g的基础知识,包括服务、SQL*Plus命令以及网络配置等方面,同时也提到了一些高级特性如`MERGE INTO`和`INSERT ALL`的使用。 首先,Oracle11g包含了一些关键服务,如`...

    Oracle数据库性能优化浅析

    对于Oracle数据库而言,优化SQL查询不仅能够提高查询效率,还能减少系统资源消耗,进而提升整个数据库应用的响应速度和用户体验。本文将从SQL查询的内部原理、Oracle数据库服务器处理SQL的机制、Oracle数据库SQL优化...

Global site tag (gtag.js) - Google Analytics