我使用 sqlite-jdbc 驱动程序在我的 Java 程序中使用 SQLite 作为内存数据库。
我使用的查询相当复杂。然而,它非常快,通常 < 10 ms。不幸的是,之后迭代 ResultSet 的成本相当高,即使获取大小很大:
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite::memory:");
long startTime = System.currentTimeMillis();
Statement stmt = connection.createStatement();
stmt.setFetchSize(1000);
ResultSet rs = stmt.executeQuery(query);
System.out.println("query time " + (System.currentTimeMillis() - startTime));
ResultSetMetaData metaData = rs.getMetaData();
int columns = metaData.getColumnCount();
System.out.println("metadata time " + (System.currentTimeMillis() - startTime));
HashMap<String, String> record = new HashMap<String, String>();
while (rs.next())
{
System.out.println("get records time " + (System.currentTimeMillis() - startTime));
for (int i = 1; i <= columns; i++)
{
if (metaData.getColumnName(i) != null && rs.getObject(i) != null)
{
record.put(metaData.getColumnName(i), rs.getObject(i).toString());
}
}
al.add(record);
}
System.out.println("all time " + (System.currentTimeMillis() - startTime));
这个小程序的输出显示了时间消耗的地方:
query time 5
metadata time 5
get records time 5
get records time 5
get records time 6
get records time 6
get records time 15
get records time 15
get records time 26
get records time 26
all time 52
我知道如果提取大小太小,ResultSet 通常会通过网络到达数据库以移动光标并获取更多数据。但是,在我的情况下,获取大小相当大(1000),数据库在内存中,结果集包含少量条目(<20)。
有什么想法可以让它更快吗?有人知道 SQLite 如何处理选择吗?
提前致谢。塞巴斯蒂安