读取大量记录 (Batch READ) DB2

Posted

技术标签:

【中文标题】读取大量记录 (Batch READ) DB2【英文标题】:Read large amount of records (Batch READ) DB2 【发布时间】:2019-03-20 17:25:42 【问题描述】:

您好,我需要从 DB2 表中过滤大量数据,而不需要按顺序读取。为了并行化 READ,我首先从具有良好基数(没有太多重复)的索引中读取所有元素,然后将它们划分为 100 个列表,然后使用

SELECT from TABLE where mycolumn in ('value1','value2'....'value100') with UR

打开跟踪某些 SQL 后,它会显示为 5000 条记录的结果集提供服务:

User CPU: 0.032192 seconds
System CPU: 0.003841 seconds

DB2 位于 SSD 驱动器上。为什么需要 32ms 的用户时间?

在 Java 端,我已将 JDBC 驱动程序配置为使用 ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY

更详细一点,我需要用数据快速填充内存结构。为此,我需要能够快速读取数据库中的数据。

可能是 DB2 缓冲区设置得太低了吗?有什么建议么 ?

【问题讨论】:

调优数据库是关于配置和访问计划的。这是配置问题,而不是编程问题。缓冲池大小、表空间的预取大小、预取器的数量、缓冲池是否已播种、Db2 的可用 RAM、rqrioblk 都会发挥作用。所有配置,而不是编程。目前尚不清楚您为什么在问题上标记了 Oracle。 @mao 当我们谈到选择大量记录时,什么会发挥最大的作用?缓冲区 + 预取 + RAM ? @mao 我也用 oracle 标记了它,因为我认为一般概念应该是相同的。你列举的术语在oracle中是一样的。这是一个非常笼统的问题。一次读取数百万行的快速方法。 也许是一个“通用”问题,但每个 rdbms 产品在其内部架构和实现方面都与其他产品有很大的不同。在一个人中高度可配置的东西在另一个人中甚至可能不作为一个概念存在。并且不要忘记时间可能在数据库之外......就像在数据库和客户端之间通过网络移动数据所需的时间一样。 如果您不使用参数标记,我会假设您的 CPU 每次都用于编译查询 【参考方案1】:

尝试以下方法:

Select *
from TABLE t
where mod(mycolumn, N)=x

N - 并行流的数量 x - [0, N-1] - 流号

如果您没有具有足够高基数的mycolumn,请尝试使用rid(t) 表达式而不是mycolumn

rid 函数参考。

【讨论】:

这对我不起作用。我的主要循环是围绕 mycolumn 进行的。

以上是关于读取大量记录 (Batch READ) DB2的主要内容,如果未能解决你的问题,请参考以下文章

用于分布式 DB2 数据库的 Spring Batch Reader

Spring Batch - MongoItemReader 未读取所有记录

Spring Batch - 处理大量数据

限制 JdbcPagingItemReader 在 Spring Batch 项目中可以读取的总记录数

Spring-batch学习总结—ItemReader普通文件,数据库,XML,多文件数据读取

读取大量 parquet 文件:read_parquet vs from_delayed