调整方法二:建立临时表+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
2AS
3SELECT *FROM DBA_OBJECTS
4WHERE 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
2AS
3SELECT *FROM DBA_OBJECTS
4WHERE 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。
lMerge语句简介
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
2using t4
3on (t3.object_id = t4.object_id)
4when matched then update set t3.object_name = t4.object_name
5when not matched then insert (t3.object_id,t3.object_name)
6values (t4.object_id,t4.object_name)
7/
47628行已合并。
已用时间:00: 00: 06.00SQL>