我在java中有一个在db2和sybase之间移动数据的数据归档进程。仅供参考-这不是通过任何导入/导出过程完成的,因为在运行时每个表上都有几个可用的条件,因此这个过程是用java开发的。
现在,我为每个源和目标组合定义了单个DatabaseReader和DatabaseWriter,以便在多个线程中移动数据。我想我想进一步扩展它,我可以为每个源和目标组合定义多个DatabaseReaders和多个DatabaseWriters。
例如,如果源数据大约有100行,我定义了10个读取器和10个写入器,每个读取器将读取10行,并将它们提供给写入器。我希望根据服务器CPU、内存等资源的不同,进程能给我带来极致的性能。
但我猜问题在于这些源表没有主键,并且在多个集合中抓取行极其困难。
db2提供了rownum的概念,我想生活要简单得多,Oracle呢?如何使用db2实现此行为?有没有一种方法可以先获取10条记录,然后再获取下10条记录,依此类推?
有什么建议/想法吗?
Db2版本- DB2 v8.1.0.144修复包编号- 16 Linux
发布于 2010-04-29 12:56:32
如果我理解正确的话,您只是尝试以10行为一批的方式写入目标表。不需要将读取批处理为10行。
只需触发select语句,然后继续读取,直到数据用完。每隔10行,您就可以调用编写器。然而,大多数jdbc客户端都会在幕后执行这种优化,所以这可能不会比一次插入一行更好。
我怀疑nieve多线程实现是否会加快速度,因为目标数据库引擎无论如何都在做大部分工作,而且它将受到日志写入和锁定的约束,而多线程并没有帮助(或者使情况更糟!)。
据我所知,一个简单的单线程"select"/"insert“进程很容易就能胜过你的多线程程序。还有其他方法可以优化这个过程:
发布于 2010-04-15 13:03:07
DB2确实支持rownum概念。由于不知道您的数据库架构,下面是一个示例:
SELECT *
FROM (
SELECT rownumber() OVER (order by column1, column2) AS number, column1, column2
FROM mytable
) temp
WHERE number BETWEEN 20 AND 30这里的子查询获取表中的每一行,并根据指定的顺序分配rownumber函数。“外部”查询可以使用行号来选择批处理中实际需要的行。
https://stackoverflow.com/questions/2631124
复制相似问题