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 的用法 在 Oracle 数据库中,Merge Into 语句是一种非常有用的功能,它主要用来合并 update 和 insert 语句,即用一个表中的数据来修 改或插入到另一个表中。Merge Into 语句的主要原则...
在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...
标题:Oracle Merge Into 的使用 描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为...
在Oracle数据库系统中,死锁是一种常见的并发问题,它会导致多个事务之间互相等待对方释放资源而无法继续执行,最终导致整个系统的运行效率降低甚至停滞。死锁不仅影响数据库性能,还会影响应用程序的可用性和用户...
在Oracle数据库中,`MERGE INTO`语句是一种非常强大的工具,它允许用户根据源表中的数据更新目标表,同时也可以插入新记录。这一特性在处理大量数据时尤其有用,因为它能够在一个步骤中完成更新和插入操作,从而提高...
首先,需要使用Oracle 9i及其以后版本支持的merge into语句,该语句可以实现insertOrUpdate的功能。然后,使用Mybatis的动态SQL语法foreach循环插入,待插入的实体bean的List通过查询数据库dual形成表。foreach的 ...
总结来说,`MERGE INTO`语句是数据库管理中的一个重要工具,尤其是在处理数据同步和更新时。熟练掌握`MERGE INTO`的用法,能够有效地提升数据处理的效率和准确性。通过实例,我们可以看到它如何根据不同的匹配情况...
Oracle中的`MERGE INTO`语句是一种强大的工具,用于整合数据操作,如更新、插入和删除,基于两个数据源的匹配条件。这个语句在处理数据仓库、数据同步或者复杂业务逻辑时非常有用。让我们详细了解一下`MERGE INTO`的...
自Oracle 9i版本开始,Oracle数据库引入了一个非常强大的SQL语句——`MERGE`命令。通过这个命令,用户可以在一个单一的SQL语句中完成对表的插入(`INSERT`)和更新(`UPDATE`)操作,极大地简化了数据处理流程并提高了...
非常经典的SQL经验,适合于数据库初学者及长期从事软件开发者
在数据库管理领域,高效的数据导入导出以及合并更新是日常工作中不可或缺的部分。Oracle数据库提供了一套强大的工具,包括SQL*Loader(简称SQLLDR)和SQL Ultra Data Recorder 2(SQLULDR2),来帮助我们处理这些...
本文将详细介绍 Oracle 中 `MERGE` 关键字的使用方法,并结合实际示例来解析其工作原理。 #### 二、`MERGE` 语句的基本概念 在 Oracle 9i R2 版本之前,如果需要同时进行更新和插入操作,开发人员通常需要编写两条...
Oracle作为广泛使用的关系数据库管理系统(RDBMS),其性能调优尤为关键。本篇将继续深入探讨Oracle数据库性能调优的诸多方面,重点关注于嵌套循环执行计划,这是数据库多表操作中常见的连接方式之一。 首先,了解...
Merge 函数的使用方式有三种:只更新不插入、只插入不更新和既插入也更新。 Merge 函数的基本用法 Merge 函数的基本语法结构为: ```sql MERGE INTO 目标表 USING 来源表 ON (条件) WHEN MATCHED THEN 更新操作 ...
如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 ...
详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询
这篇学习笔记主要涵盖了Oracle11g的基础知识,包括服务、SQL*Plus命令以及网络配置等方面,同时也提到了一些高级特性如`MERGE INTO`和`INSERT ALL`的使用。 首先,Oracle11g包含了一些关键服务,如`...
对于Oracle数据库而言,优化SQL查询不仅能够提高查询效率,还能减少系统资源消耗,进而提升整个数据库应用的响应速度和用户体验。本文将从SQL查询的内部原理、Oracle数据库服务器处理SQL的机制、Oracle数据库SQL优化...