【问题标题】:DB2 Z/OS Insert/Select PerformanceDB2 Z/OS 插入/选择性能
【发布时间】:2014-11-27 19:40:31
【问题描述】:

我们现在正在开发一个在带有 db2 z/OS 10 的 websphere z/OS 8.5 上运行的系统。目前我们面临以下性能问题:

我们需要将记录从一张表复制到另一张表。对于超过 30mio 条目,此复制应在大约 15 分钟内完成。

我们现在有什么: - 两个表都是分区的(相同的分区列 x) - 使用 websphere 批处理在 java 中复制批处理。该批处理作业并行运行,每个并行子作业在一个分区上执行一次插入/选择(复制大约 3-5 个 mio 条目)。从数据点的角度来看,并行作业应该是完全分离的。

我们正在执行的 SQL 看起来像这样

Insert into targetTable (...) Select (...) from sourceTable Where partitionKey='xxx'.

我们在观察什么: 插入/选择没有充分发挥 db2 的插入性能潜力: - 插入/选择:大约 8000 次插入/秒 - 通过 jdbc 批处理的普通插入:超过 50 000 次插入/秒

我们想问以下问题: - 为什么单次插入/选择的插入性能这么慢?我们需要做一些特殊的配置吗? - 在多个分区上并行工作是正确的方法吗?有什么选择吗? - 我们应该提交较小的插入/选择包吗? - db2 在插入/选择时在后台做什么

谢谢你和最好的问候

【问题讨论】:

  • 注意显示实际语句,还是我们应该猜测?你看声明解释计划了吗?你为什么首先使用 Java 来做这件事?
  • 我支持@mustaccio - 如果您在 Java 中“按行”执行此操作,预计会受到(可能是巨大的)性能影响。对于大量记录,几乎总是最好使用一次捕获/移动每个人的单个查询。
  • 一次插入一个分区(约3mio)的所有记录的一条大语句。让我添加一个类似的 sql 语句: Insert into targetTable (...) Select (...) from sourceTable Where partitionKey='xxx'.

标签: performance db2 zos insert-select


【解决方案1】:

这不是需要这么长时间的“单次插入”。这是 3,000,000 次插入。

您分析此问题的方式与分析 RDBMS 的任何其他问题的方式相同...

  1. where 子句在您的select 语句sargable 上吗?
  2. 目标表上是否有索引?多少?你能减少这个数字吗?
  3. explain 输出告诉您什么?
  4. select 中是否隐含了 sort 操作?

...很遗憾,我们无法为您提供帮助。

至于单次插入/选择和 JDBC 批处理之间的区别,后者(使用 DB2 网关,其他“帮助”软件)可能会发挥作用,我无法评论。我会说将单个插入/选择移动到 SQL/PL 原生存储过程中值得探索。

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2021-12-02
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多