关于Update语句的调整(5-1)

调整方法二:建立临时表+Merge

(1)


1.         调整方法二:建立临时表+Merge

通过建立临时表保存中间结果并结合merge语句的方法对语句进行调整。

 

背景知识简介

 

l         临时表简介

 

数据库中的所有会话均可以访问临时表,但只有插入数据到临时表中的会话才能看到本身插入的数据。可以把临时表指定为事务相关(默认)或者是会话相关:

ON COMMIT DELETE ROWS:指定临时表是事务相关的,Oracle在每次提交后截断表。

ON COMMIT PRESERVE ROWS:指定临时表是会话相关的,Oracle在会话中止后截断表。

通过使用Oracle的临时表后可以并行的对数据进行处理,有效的提高了数据处理的速度。

 

下面是创建临时表的例子

 

CREATE GLOBAL TEMPORARY TABLE TEMP_TEST

AS

SELECT *FROM DBA_OBJECTS

WHERE 1 = 2

/

 

CREATE INDEX IDX_OBJECT_ID ON TEMP_TEST(OBJECT_ID)

/

 

在临时表上插入数据比在普通表上插入数据要快得多:

SQL> SET TIMING ON

SQL>

SQL> DROP TABLE TEMP_TEST_1

  2  /

 

表已丢弃。

 

已用时间:  00: 00: 00.00

SQL> CREATE GLOBAL TEMPORARY TABLE TEMP_TEST_1

  2  AS

  3  SELECT *FROM DBA_OBJECTS

  4  WHERE 1=2

  5  /

 

表已创建。

 

已用时间:  00: 00: 00.01

SQL>

SQL> DROP TABLE TEMP_TEST_2

  2  /

 

表已丢弃。

 

已用时间:  00: 00: 00.03

SQL> CREATE TABLE TEMP_TEST_2

  2  AS

  3  SELECT *FROM DBA_OBJECTS

  4  WHERE 1=2

  5  /

 

表已创建。

 

已用时间:  00: 00: 00.02

SQL>

SQL> INSERT INTO TEMP_TEST_1 SELECT * FROM DBA_OBJECTS

  2  /

 

已创建47622行。

 

已用时间:  00: 00: 01.04

SQL> INSERT INTO TEMP_TEST_2 SELECT * FROM DBA_OBJECTS

  2  /

 

已创建47622行。

 

已用时间:  00: 00: 04.07

SQL>

 

我们看看,47622行记录插入临时表只需要01.04,而插入普通表则需要04.07

 

l         Merge语句简介

 

Merge语句的基本语法:

 

MERGE INTO .TABLE1

USING .TABLE2

ON (TABLE1. = TABLE2.)

WHEN MATCHED THEN

WHEN NOT MATCHED THEN ;

 

 

Merge把一张表中的数据插入到另外一张表中或者更新对应的记录,插入与更新由ON子句决定。

 

下面是使用Merge语句的一个例子:

SQL>

SQL> drop table t3

  2  /

 

表已丢弃。

 

已用时间:  00: 00: 00.00

SQL> create table t3 as select * from dba_objects where rownum <= 30

0

  2  /

 

表已创建。

 

已用时间:  00: 00: 00.02

SQL> drop table t4

  2  /

 

表已丢弃。

 

已用时间:  00: 00: 00.00

SQL> create table t4 as select * from dba_objects

  2  /

 

表已创建。

 

已用时间:  00: 00: 00.07

SQL> create index idx_t3_id on t3(object_id)

  2  /

 

索引已创建。

 

已用时间:  00: 00: 00.01

SQL> create index idx_t4_id on t4(object_id)

  2  /

 

索引已创建。

 

已用时间:  00: 00: 00.05

SQL> merge into t3

  2  using t4

  3  on (t3.object_id = t4.object_id)

  4  when matched then update set t3.object_name = t4.object_name

  5  when not matched then insert (t3.object_id,t3.object_name)

  6  values (t4.object_id,t4.object_name)

  7  /

 

47628 行已合并。

 

已用时间:  00: 00: 06.00

SQL>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-21522/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/6906/viewspace-21522/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值