ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于Update语句的调整(5-1)

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

原创 Linux操作系统 作者:husthxd 时间:2005-03-16 00:00:00 0 删除 编辑

调整方法二:建立临时表+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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: Hibernate问题(1)
请登录后发表评论 登录
全部评论
长期从事政务、金融等行业产品研发和架构设计工作,ITPUB数据库版块资深版主,对Oracle、PostgreSQL以及大数据等相关技术有深入研究。现就职于广州云图数据技术有限公司,系统架构师。

注册时间:2007-12-28

  • 博文量
    1249
  • 访问量
    3723583