调整方法二:建立临时表+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
USING
ON (TABLE1.
WHEN MATCHED THEN
WHEN NOT MATCHED THEN
Merge把一张表
下面是使用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/,如需转载,请注明出处,否则将追究法律责任。