« 并行SQLULDR2和DataCopy操作 »
Tools » http://www.anysql.net/tools/parallel-datacopy-datasync.html 2010-04-15在使用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来处理数据也不是难事了.


越来越强大了
正在整合TabSplit与DataCopy, 推出并行版的DataCopy.
正在整合TabSplit与SQLULDR2, 推出并行版的SQLULDR2.
[...] « DataCopy : Parallel Inside Now! Tools » http://www.anysql.net/tools/parallel-inside-datacopy.html 2010-04-16 [...]
[...] 通过的TabSplit程序的测试, 及完成并行版DataCopy工具后, [...]