繁体   English   中英

db2中的Oracle rownum-Java数据归档

[英]Oracle rownum in db2 - Java data archiving

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

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

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

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

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

有什么建议/想法吗?

Db2版本-DB2 v8.1.0.144 Fix Pack Num-16 Linux

如果我理解正确,那么您只是试图以10行为批次写入目标表。 无需将读取批处理成10行。

只需触发select语句,然后继续读取,直到用完数据为止。 在第10行上,您可以调用编写器。 但是,大多数jdbc客户端都会在后台进行这种优化,因此,这似乎并不比一次插入一行更好。

我怀疑,一个灵活的多线程实现会加快目标数据库引擎无论如何执行大部分工作的速度,并且会受到日志写入和锁定的约束,而多线程处理无济于事(或使情况更糟!)。

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

  1. 调优数据库客户端,以便批量处理网络操作。
  2. 检查您的“ COMMIT”处理,以便在每插入100次左右后提交一次。

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函数。 “外部”查询可以使用行号选择批处理中实际需要的行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM