|
2.2.2 Insert into …. select ….
接下来我们看一下Insert 的性能,在执行Insert前将归档日志清空:
SQL> set timing on
SQL> create table c as select * from a where 1<0;
表已创建。
已用时间: 00: 00: 00.45
SQL> insert into c select * from a;
已创建5083000行。
已用时间: 00: 10: 31.64
再次查看回滚段表空间状态:
SQL> /
文件号 表空间名 空间(M) 已用(M) 剩余空间(M) 可用比率
---------- --------------- ---------- ---------- ----------- ----------
2 UNDOTBS1 3000 1032.625 1967.375 65.5791667
咦,回滚段表空间依然是1032.625M,难道Insert不生成undo信息?不可能啊。
偶再次执行insert into c select * from a; 并启动一个监控程序,每5秒报告UNDOTBS1的空间信息,这才发现了问题所在.
原来在开始执行Insert的时候回滚段表空间被释放了一部分,释放到687.625M,然后在Insert的过程中逐渐增长,最后又增长到1032.625M,说明Insert生成了1032.625-687.625=345M回滚信息。
回滚段表空间为什么会先释放后增长呢,它里面明明有足够的Free空间呀,这个偶也想不明白了。
同样,偶也想到,Copy Command会不会也是这种情况呢
所以,偶再次执行Copy,也同样地监控回滚段表空间,发现在执行过程中回滚段表空间始终是1032.625M,最终证明了Copy command没有生成Undo信息。
接下来查看归档日志,发现Insert生成了1.72G的归档日志,归档日志的数据量是Copy Command的三倍之多。
执行时间从上面的结果已经可以看到了:
已用时间: 00: 10: 31.64
10分31.64秒 = 631.64秒。
2.2.3 Create … as select…
最后来看看Create的性能。
SQL> create table d as select * from a;
表已创建。
已用时间: 00: 04: 04.79
在执行过程中监控Undo表空间,发现也没有生成回滚信息。其实Create不生成回滚是很好理解的,因为Create Table 是DDL语句,根本无法回滚,自然也就不会生成回滚信息了。
经查看发现生成了515M归档日志,比Insert少得多,比Copy Command也少一些。
执行时间上快得有些出乎意料:
4分4.79秒 = 244.79秒,明显快于前两种方案。
在这里偶对Create的执行机制产生了一个猜测,认为它并不是把数据先Query出来,再用Query的结果写入目标表中,而是直接读Block数据并写入目标表中,所以才会有这么快的执行速度。
下面来验证一下:
SQL> create view v_a as select * from a;
视图已创建。
已用时间: 00: 00: 00.14
SQL> create table e as select * from v_a;
表已创建。
已用时间: 00: 04: 03.62
从上面的结果看出还是很快,难道是这个视图太特殊了,再试一个:
SQL> drop view v_a;
视图已删除。
SQL> desc a;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
SQL> create view v_a as select owner,object_name,subobject_name,
rownum rno,data_object_id,object_type,created,
last_ddl_time,timestamp,status,temporary,generated,secondary
from a;
视图已创建。
已用时间: 00: 00: 00.03
SQL> create table e as select * from v_a;
表已创建。
已用时间: 00: 04: 12.65
这个结果依然是很快,看来偶的猜测是完全错误的,那Create table ….as select 为什么会这么快呢?偶是想不明白了,敬请诸位老大指教一下。 |
|