在使用SQLULDR2或DataCopy处理几百GB的大表时, 会发现还是需要很长的时间, SQLUDLR2或DataCopy进程很容易将一个CPU跑满, 这时就会想到Oracle中的并行处理机制, 能不能用到这些工具中来. 在这之前, 我一直建议用人工并行, 指手工区分数据, 然后启动多个SQLULDR2或DataCopy进程, 以利用多CPU的资源, 人工并行使用起来的确不方便.

    并行最关键的因素是如何对表进行切片, 人工切片就是人工并行, 自动切片就是自动并行. 如何自动切片呢? 为此设计了一个用ROWID来对表进行切片的程序(TabSplit), 使用方法如下.

Usage: tabsplit user=… owner=… table=… [part=...] [degree=...]

    在测试机上有一个EMP_HIS表, 比较大, 需要用并行度4来进行导出, 用TabSplit来切分一下看看吧.

D:\>tabsplit owner=scott table=emp_his degree=4
ROWID>=’AAADAUAAEAAAE0xAAA’ AND ROWID < ‘AAADAUAAEAAAFUIEAA’
ROWID>=’AAADAUAAEAAAFUJAAA’ AND ROWID < ‘AAADAUAAEAAAHEIEAA’
ROWID>=’AAADAUAAEAAAHEJAAA’ AND ROWID < ‘AAADAUAAEAAAHiIEAA’
ROWID>=’AAADAUAAEAAAHiJAAA’ AND ROWID < ‘AAADAUAAEAAAH8IEAA’

    分别来查一下各片的记录数, 并作累计, 看看是不是与表的总记录数相等.

SQL> select count(*) from scott.emp_his where
  2  ROWID>=’AAADAUAAEAAAE0xAAA’ AND ROWID < ‘AAADAUAAEAAAFUIEAA’;

    307200

SQL> select count(*) from scott.emp_his where
  2  ROWID>=’AAADAUAAEAAAFUJAAA’ AND ROWID < ‘AAADAUAAEAAAHEIEAA’;

    309421

SQL> select count(*) from scott.emp_his where
  2  ROWID>=’AAADAUAAEAAAHEJAAA’ AND ROWID < ‘AAADAUAAEAAAHiIEAA’;

    309606

SQL> select count(*) from scott.emp_his where
  2  ROWID>=’AAADAUAAEAAAHiJAAA’ AND ROWID < ‘AAADAUAAEAAAH8IEAA’;

    253469

SQL> select 307200+309421+309606+253469 from DUAL;

                    1179696

    再查一下总的记录数, 看看是否相等.

SQL> select count(*) from scott.emp_his;

  1179696

    可以看到结果是相等的, 这是第一步. 如果这个自动分片结果准确, 那么在Linux或Unix下, 启动并行SQLULDR2和DataCopy来处理数据也不是难事了.