【问题标题】:How to improve the performance of SELECT query to a table in NuoDB如何提高对 NuoDB 中表的 SELECT 查询性能
【发布时间】:2020-10-18 19:46:03
【问题描述】:

要求:

  1. 请考虑使用 spring 批处理应用程序。
  2. 输入是一个包含一列值的文件。
  3. Spring Batch 被设计为面向块的设计。
  4. Chunk 设计为一次记录 1000 条记录
  5. 因此,Reader 在微秒内从文件中读取 1000 条记录。
  6. 处理器一次获取一条记录并触发 SQL 查询:

select * from TABLE where COLUMN2 = "record"

可能只有一条或多条记录被检索到,并且这些记录要经过一些业务逻辑。

  1. 在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


【解决方案1】:

select * from TABLE where COLUMN2 = "record"

请告知,添加列作为索引是否是更好的解决方案。

是的,为where 子句中使用的列添加索引应该可以提高性能,在您的情况下,它是COLUMN2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2020-02-08
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多