1

我在 java 中有一个数据归档过程,可以在 db2 和 sybase 之间移动数据。仅供参考 - 这不是通过任何导入/导出过程完成的,因为每个表上都有几个在运行时可用的条件,因此这个过程是在 java 中开发的。

现在,我为每个源和目标组合定义了单个 DatabaseReader 和 DatabaseWriter,以便在多个线程中移动数据。我想我想进一步扩展它,我可以为每个源和目标组合定义多个 DatabaseReaders 和 Multiple DatabaseWriters。

因此,例如,如果源数据大约有 100 行,我定义了 10 个读取器和 10 个写入器,每个读取器将读取 10 行并将它们提供给写入器。我希望进程能够根据服务器上可用的资源 [CPU、内存等] 为我提供极致的性能。

但我想问题是这些源表没有主键,并且很难在多个集合中抓取行。

Oracle 提供了 rownum 概念,我想那里的生活要简单得多....但是 db2 怎么样?如何使用 db2 实现这种行为?有没有办法说获取前 10 条记录,然后获取接下来的 10 条记录,依此类推?

有什么建议/想法吗?

DB2 版本 - DB2 v8.1.0.144 修订包编号 - 16 Linux

4

2 回答 2

0

如果我理解正确,您只是尝试以 10 行为一组写入目标表。无需将读取分批成 10 行。

只需触发 select 语句,然后继续阅读,直到数据用完。在每 10 行,您可以调用编写器。然而,大多数 jdbc 客户端将在幕后执行这种优化,因此这可能不会比一次插入一行更好。

我怀疑 nieve 多线程实现是否会加快速度,因为目标数据库引擎无论如何都在完成大部分工作,并且它将受到日志写入和锁定的限制,而多线程无济于事(或者变得更糟!)。

据我所知,一个简单的单线程“选择”/“插入”过程将轻松胜过您的多线程程序。还有其他优化方法:-

  1. 调整您的数据库客户端,以便批量处理网络操作。
  2. 检查您的“提交”处理,以便您在每 100 次左右插入后提交。
于 2010-04-29T04:56:31.913 回答
-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函数是根据指定的顺序分配的。“外部”查询可以使用行号来选择您实际需要的批次行。

于 2010-04-15T05:03:07.037 回答