【问题标题】:Sqlite ExecuteQuery very slow with java (netbeans)Sqlite ExecuteQuery 使用 java (netbeans) 非常慢
【发布时间】:2015-04-12 20:38:08
【问题描述】:

我使用 sqlite 来存储数据。我正在尝试从 sqlite 表视图中获取数据并填充 java 中的对象数组,但查询执行需要很长时间。 我只有 32 个具有 22 个字段的对象,以及具有 380 行的 sqlite。 但是执行类似的语句花了我 17 秒来处理 32 个对象。

 sql = "SELECT "
                        + "           field1,"
                        + "           field2,"
                        ....
                        + "           field22"
                        + " from Rankedview WHERE Ranking = " + Integer.toString(RankingIndex);
 try (ResultSet rs = stmt.executeQuery(sql)) {
                    while (rs.next()) {
                        a[j].field1= rs.getString("field1");
                        ..........
                        a[j].field22 = rs.getInt("field22");
                    }

                }

在我将 sqlite-jdbc 驱动程序从 3.7.2 更新到 3.8.5 后,时间从 17 秒降低到 9 秒。

如何提高其性能?

编辑:

视图定义(ATP 是一个表)

CREATE VIEW Ranked AS
SELECT p1.ID,
       p1.field2,
       ...

       p1.field21,
       (
           SELECT count() + (
                                SELECT count() + 1
                                  FROM Table AS p2
                                 WHERE p2.field21 = p1.field21 AND 
                                       p2.id > p1.id
                            )
             FROM ATP AS p2
            WHERE p2.field21 > p1.field21
       )
       AS Ranking
  FROM ATP AS p1
 ORDER BY Ranking ASC;

解释查询计划输出:

selectid order from detail
0   0   0   SCAN TABLE ATP AS p1
0   0   0   EXECUTE CORRELATED SCALAR SUBQUERY 1
1   0   0   SCAN TABLE ATP AS p2
1   0   0   EXECUTE CORRELATED SCALAR SUBQUERY 2
2   0   0   SEARCH TABLE ATP AS p2 USING INTEGER PRIMARY KEY (rowid>?)
0   0   0   EXECUTE CORRELATED SCALAR SUBQUERY 3
3   0   0   SCAN TABLE ATP AS p2
3   0   0   EXECUTE CORRELATED SCALAR SUBQUERY 4
4   0   0   SEARCH TABLE ATP AS p2 USING INTEGER PRIMARY KEY (rowid>?)
0   0   0   EXECUTE CORRELATED SCALAR SUBQUERY 5
5   0   0   SCAN TABLE ATP AS p2
5   0   0   EXECUTE CORRELATED SCALAR SUBQUERY 6
6   0   0   SEARCH TABLE ATP AS p2 USING INTEGER PRIMARY KEY (rowid>?)
0   0   0   USE TEMP B-TREE FOR ORDER BY

【问题讨论】:

  • 哪个 Java 语句花费的时间最多?
  • ResultSet rs = stmt.executeQuery(sql)
  • 显示视图定义、所有索引以及EXPLAIN QUERY PLAN的输出。
  • 查看定义和解释查询计划在我编辑的帖子中

标签: java performance sqlite netbeans jdbc


【解决方案1】:

要获得具有特定排名的行,您不应手动计算排名,而应使用LIMIT/OFFSET clauses

SELECT ...
FROM ATP
ORDER BY field21, id
LIMIT 1 OFFSET x

这仍然需要对所有表行进行排序以确定第 x 行,但比多次嵌套表扫描效率更高。

【讨论】:

  • 效果很好。 executeQuery 现在不到 0.15 秒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2013-01-30
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多