以下方法主要针对海量数据入库及迁移时应用,测试的方法与结果仅供参考。理论上向本地表中附加数据将会产生大量redo数据(和较少的undo数据),随着时间的增长,数据将占用大量的磁盘空间不能释放,而且在数据备份及时的情况下,不需要redo恢复数据,所以在实际应用中应当尽量避免redo的产生。本次测试针对”Create table select”、”Copy”、” Insert into select”三种数据附加语句进行比较,尤其是当附加数据不在本地时,对时间效率和存储空间的占用情况进行测试。
1. 测试步骤
1) 建立远程测试表tmp,向其中插入2,200,000条数据,记录数据文件大小。
2) 建立dblink连接tmp表的实例。
3) 新建表tmp_insert使用” Insert into select”语句进行数据附加,记录数据文件大小、附加时间、redo段大小。
4) 使用” Create table tmp_create select”语句进行数据附加,记录数据文件大小、附加时间、redo段大小。
5) 新建表tmp_copy使用”copy”语句进行数据附加,记录数据文件大小、附加时间、redo段大小。
6) 新建压缩表tmp_copy_press使用”copy”语句进行数据附加,记录数据文件大小、附加时间、redo段大小。
7) 新建压缩表tmp_insert_press使用” Insert /*+append */ intoselect”语句加入nologging参数进行数据附加,记录数据文件大小、附加时间、redo段大小。
2. 数据统计
a) Tmp表数据文件大小统计
b) tmp_insert表数据文件大小统计
耗时72.562s
Redo段统计
c) tmp_create表数据文件大小统计
耗时52.515s
Redo段统计
d) 执行过程
tmp_copy表数据文件大小统计
耗时154s
Redo段统计
e) 执行过程
tmp_copy_press表数据文件大小统计
耗时154s
Redo段统计
f) tmp_insert_press表数据文件大小统计
耗时82.875s
Redo段统计
3. 对比结果
| 数据文件大小 | 耗时 | Redo段大小 |
Insert | 591M | 72.562s | 592904384 |
Create | 592M | 52.515 | 690852 |
Copy | 592M | 154s | 0 |
Copy压缩表 | 533M | 154s | 0 |
Insert压缩表 | 256M | 82.875s | 2095060 |
4. 结论
i. ” Insert into select”产生大量redo,优点是通用的sql语句,支持大多数数据库平台,适合少量数据附加。
ii. ”Create table select”不产生redo,附加数据时间少,但是必须在表未建立的情况下附加。
iii. ”Copy”不产生redo,附加数据时间长,支持表存在情况下的大量数据的附加,但必须在oracle的sqlplus下执行,不支持pl/sql。
iv. ”Copy”不支持压缩表批量附加压缩功能。
v. ” Insert /*+append */ into select”加入nologging参数后,产生少量的redo,并且支持表压缩,适合大数据量的附加数据。