在用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命令行选项.