我在java中有一个数据存档过程,可以在db2和sybase之间移动数据。仅供参考 - 这不是通过任何导入/导出过程完成的,因为每个表上有几个条件在运行时可用,因此此过程是在java中开发的。
现在我为每个源和目标组合定义了单个DatabaseReader和DatabaseWriter,以便在多个线程中移动数据。我想我想进一步扩展这个,我可以为每个源和目标组合定义多个DatabaseReader和多个DatabaseWriters。
因此,例如,如果源数据大约是100行,并且我定义了10个读者和10个写入者,则每个读者将读取10行并将其提供给编写者。我希望进程能给我带来极高的性能,具体取决于服务器上的可用资源[CPU,内存等]。
但我想问题是这些源表没有主键,并且在多个集合中抓取行非常困难。
Oracle提供rownum概念,我猜那里的生活要简单得多......但db2怎么样?如何使用db2实现此行为?有没有办法说获取前10条记录,然后获取接下来的10条记录,依此类推?
有任何建议/想法吗?
Db2版本 - DB2 v8.1.0.144 Fix Pack Num - 16 Linux的
答案 0 :(得分:0)
如果我理解正确,你只是试图以10行的批量写入目标表。无需将读取批处理为10行。
只需激活select语句,然后继续阅读,直到数据用完为止。 在每隔10行,您可以调用编写器。但是大多数jdbc客户端都会在封面下执行这种优化,所以这可能不会比一次插入一行更好。
我怀疑一个nieve多线程实现会加快速度,因为目标数据库引擎无论如何都在完成大部分工作,并且它会受到日志写入和锁定的限制,多线程无法帮助(或者更糟糕!)。
据我所知,简单的单线程“选择”/“插入”过程将轻松胜过您的多线程程序。还有其他方法可以优化它: -
答案 1 :(得分:-1)
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函数。 “外部”查询可以使用rownumber来选择批次实际需要的行。