在用Oracle的exp/imp工具时, 常常有人嫌它忙, 这个两个工具是比较慢, 除了用比较大的buffer参数外, 还是有办法可以加快的. 在exp时, 可以考虑更改表的并行度(ALTER TABLE xxx PARALLEL 4), 或者更改exp进程的Multiple Block Read参数的值.
SELECT SID, SERIAL# FROM V$SESSION WHERE PROGRAM LIKE 'exp%';
exec dbms_system.set_int_param_in_session( sid, serial#,
'db_file_multiblock_read_count', 128);
exec dbms_system.set_bool_param_in_session( sid, serial#,
'_serial_direct_read', true);
在imp时, 没有什么办法可以提高它的速度, 但如果imp过程中包含了索引, 则可以不导入索引和约束(Primary或Unique), 而改为人工来创建. 如果不想这么麻烦呢, 也可以通过更改Session一级的参数微调一下.
SELECT SID, SERIAL# FROM V$SESSION WHERE PROGRAM LIKE 'imp%';
exec dbms_system.set_int_param_in_session( sid, serial#,
'db_file_multiblock_read_count', 128);
exec dbms_system.set_int_param_in_session( sid, serial#,
'sort_area_size', 104857600);
exec dbms_system.set_int_param_in_session( sid, serial#,
'sort_area_retained_size', 104857600);
exec dbms_system.set_int_param_in_session( sid, serial#,
'sort_multiblock_read_count', 128);
更改表的并行度的方法不是很好, 但是Oracle好象没有提供强制其他会话Parallel运行的接口, 用Logon触发器, 还是觉得太麻烦了一些, 不明白Oracle为什么不给exp工具加个HINT或Parallel命令行选项.
留言 (6)
在本本上测试multiblock read的作用, 导出62MB数据所用的时间, 单位秒.
M128 M16test0 9 16
test1 9 12
test2 9 11
test3 9 15
test4 9 11
Posted by anysql | Nov 29, 2007 9:35 AM
需要设置sort_area_size吗?应该使用的undo表空间吧?有一次导入10G的数据,undo表空间狂涨。。。
Posted by iceinwater | Dec 3, 2007 9:39 PM
那是因为你设了自动扩展, Undo表空间会尽量保留Retention Time指定的时间内产生的原值, 因为imp时, 数据变更多, 所以才会变大的.
实际是指定commit=y, 加上不让undo自动扩展就可以了.
Posted by anysql | Dec 3, 2007 10:08 PM
恩,当时发现这个问题的时候,已经在导入中,就没有去做处理。反正磁盘足够大。导入完毕后,重新修改了undo空间。
刚刚意思表达错了,你修改sort_area_size的目的是什么?
如果利用了PGA,就不需要sort_area_size了吧
Posted by iceinwater | Dec 4, 2007 12:35 AM
MTS下还是会用SORT_AREA_SIZE的. 让数据文件自动扩展是一个很不好的习惯.
Posted by anysql | Dec 4, 2007 8:31 AM
恩,一般我建库都是不会自动扩展,可是客户比较讨厌,总是喜欢自动扩展,而且要求设置为自动扩展,因为他们认为他们的磁盘空间足够,不想每天去看文件是否满了,是否需要手工扩展,怎么说服都没用啊,唉。
更有竞争对手会趁机迎合客户,大谈自动扩展的好处,晕菜啊
Posted by iceinwater | Dec 4, 2007 2:12 PM