java (netbeans) 的 SQLite ExecuteQuery 非常慢

Sqlite ExecuteQuery very slow with java (netbeans)

我使用sqlite来存储数据。我正在尝试从 sqlite table 视图中获取数据并填充 java 中的对象数组,但查询执行需要很长时间。 我只有 32 个对象和 22 个字段,sqlite 有 380 行。 但是执行类似的语句花了我 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是一个table)

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;

EXPLAIN QUERY PLAN 输出:

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

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

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

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