简体   繁体   English

SQLite ExecuteQuery使用Java非常慢(NetBeans)

[英]Sqlite ExecuteQuery very slow with java (netbeans)

I use sqlite to store data. 我使用sqlite存储数据。 I am trying to get data from sqlite table view and fill array of objects in java, but Query Execution takes very long time. 我正在尝试从sqlite表视图获取数据并填充java中的对象数组,但是查询执行需要很长时间。 I only have 32 objects with 22 fields, and sqlite with 380 rows. 我只有22个字段的32个对象和380行的sqlite。 But to Execute similar statement took me 17 seconds for 32 objects. 但是执行类似的语句花了我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");
                    }

                }

After I updated sqlite-jdbc driver from 3.7.2 to 3.8.5 time from 17 seconds lowered to 9 seconds. 在我将sqlite-jdbc驱动程序从3.7.2更新到3.8.5之后,时间从17秒降低到了9秒。 图片

How can I improve its performance? 如何改善其性能?

Edit: 编辑:

view definition (ATP is a table) 视图定义(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;

EXPLAIN QUERY PLAN output: 解释查询计划输出:

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

To get a row with a specific rank, you should not compute the rank by hand, but use the LIMIT/OFFSET clauses : 要获得具有特定等级的行,您不应该手动计算等级,而应使用LIMIT / OFFSET子句

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

This still requires sorting all table rows to determine which is the x-th, but is much more efficient than multiple nested table scans. 这仍然需要对所有表行进行排序以确定哪个是第x个,但比多次嵌套表扫描要高效得多。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM