【发布时间】:2020-10-18 19:46:03
【问题描述】:
要求:
- 请考虑使用 spring 批处理应用程序。
- 输入是一个包含一列值的文件。
- Spring Batch 被设计为面向块的设计。
- Chunk 设计为一次记录 1000 条记录
- 因此,Reader 在微秒内从文件中读取 1000 条记录。
- 处理器一次获取一条记录并触发 SQL 查询:
select * from TABLE where COLUMN2 = "record"
可能只有一条或多条记录被检索到,并且这些记录要经过一些业务逻辑。
- 在writer中,我们积累了业务通过的所有记录 逻辑(记录数将小于 1000)并插入 数据库。
这里的问题: 考虑一下该表存储了近 40 万条记录。
从文件中读取 1000 条记录时,需要几微秒。
在处理这 1000 条记录时(即在数据库中点击上述 SQL 查询 1000 次),需要 4 分钟来处理。
在写入数据库时(例如插入 100 条选定的记录),需要几微秒。
在分析时,我发现表中只有主键列被索引。 我们正在使用的列 (column2) 不包含在索引列中。
请告知,添加列作为索引是否是更好的解决方案。
【问题讨论】:
-
column2 可以是唯一的吗?如果不为 column2 创建索引,则此处最适合您执行 SELECT 多次。但是,我们是否可以将处理器更改为仅访问 DB 一次或至少更少次?您能否提供更多详细信息,说明为什么它应该为每条记录命中数据库?
-
COLUMN2 不是唯一的。请考虑到我们目前无法增加处理器的大小。关于为什么它为每条记录都击中数据库的问题;因为它要求我们需要检查文件中的值是否存在于数据库中。如果存在,它将检索记录并根据业务需要修改更多列值,然后作为新条目插入到数据库表中。数据库中不存在的文件中的值将被忽略。
-
是否可以将所有值保存在 arrayList 中,并根据大小仅命中 DB 一次或更少次,然后执行您的业务逻辑?
-
我不确定在 where 子句中使用 1000 个值的描述中提到的命中 SQL 查询的效率
-
是的,通过创建索引,我们可以在一定程度上提高性能。此外,单个 DB 命中或少于 10 个 DB 命中远远优于 1000 个 DB 命中。
标签: sql spring-batch nuodb