【问题标题】:Java SQLite JDBC "SELECT" statement very slowJava SQLite JDBC“SELECT”语句很慢
【发布时间】:2015-12-14 10:40:38
【问题描述】:

从一个 API 中,我得到了大约 9000 个条目,我必须将它们插入到一个表中。每个条目的详细数据都存储在另一个包含约 45000 个条目的表中

现在我正在尝试将这 9000 个条目插入到一个新表中,并从另一个表中获取有关这些条目的所需信息。

表中包含 45000 个条目的数据的 SELECT 语句每次需要 30-90 毫秒。

select的代码如下(重复9000次):

                long startTime = System.nanoTime();

                PreparedStatement selectDB = cStatic.prepareStatement("SELECT column1, column2, column3, column4 FROM DB WHERE ID = ?");
                selectDB.setInt(1, rsIDs.getInt(3));

                ResultSet rsDB = selectDB.executeQuery();

                long endTime = System.nanoTime();

                long duration = (startTime - endTime) / 1000000;

从整个过程(收集信息、插入)来看,SELECT + ResultSet 单独占用了 95% 的处理时间,我想知道如何加快速度

由于我已经搜索了解决方案,因此我已经在使用结果集中的“getInt/getString”索引,并且只调用表的所需列而不是整行,但只有很小的改进。

其他语句(UPDATE、INSERT、DELETE)几乎都用不到 1ms,为什么 SELECT 需要这么多时间?

编辑:

并没有真正加快 SELECT 的速度,但我正在重建代码以仅使用 SELECT 一次并将所有重要数据存储到一个数组中,现在它在 2-3 秒内完成,而不是 5 分钟。

感谢 Rahul,我尝试为列提供索引,这也有所帮助:

ALTER TABLE table_name ADD INDEX idx_id (ID);

【问题讨论】:

  • 约 30 毫秒对您来说有那么慢吗? Select 需要返回结果集,其他查询不需要...
  • 嗯,在我的过程中,我正在构建第二个表,其中包含约 9000 个条目,这些需要来自第一个表的数据。 9000 * 30ms 大约是 4.5 分钟,这对我来说确实很多,考虑到插入 200.000 个条目会在几秒钟内发生......
  • 所以你的实际问题是构建另一个表的速度很慢?您应该编辑问题以反映这一点。 逐行做事总是很慢。与其运行多个SELECTs,不如在一个语句中完成所有操作(SELECTINSERT)。
  • 我现在将其更改为只对所有内容使用一个选择,是的,它工作得很好,谢谢

标签: java performance sqlite select jdbc


【解决方案1】:

30ms 不应该算慢,您可能需要确保为 ID 列创建了索引或索引,因为您在 WHERE 条件中将该列用作 @987654323 @

不,我的意思是在 ID 列上创建一个唯一索引,如果您还没有的话,请在下面说明,这最终将通过执行索引扫描来加速您的查询。

ALTER TABLE table_name ADD INDEX `idx_id` (`ID`);

【讨论】:

  • 你的意思是不是“WHERE ID =?”我会写“WHERE columnIndexOfID = ?”
  • 这个变化有点快,没什么太大的变化,但另一个变化(只使用一个选择)真的很快,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2011-01-22
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多