【问题标题】:Oracle rownum in db2 - Java data archivingdb2 中的 Oracle rownum - Java 数据归档
【发布时间】:2011-02-07 12:52:20
【问题描述】:

我在 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

【问题讨论】:

  • 您能识别出您正在使用的 DB2 平台和版本吗?

标签: java db2 row-number


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    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函数是按照指定的顺序分配的。 “外部”查询可以使用行号来选择您实际需要用于批次的行。

    【讨论】:

    • 坏主意! rownunber 函数根据当前选定的行计算行号——它是在选择处理期间计算的,因此它是不可重复的并且涉及额外的处理。
    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多