[英]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.