我使用sqlite-jdbc驱动程序在我的Java程序中使用SQLite作为内存数据库。
我使用的查询相当复杂。然而,通常<非常快10毫秒 不幸的是,之后迭代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),DB在内存中,结果集包含少量条目(&lt; 20)。
我能做些什么来加快速度?有人知道SQLite如何处理选择吗?
提前致谢。 塞巴斯蒂安
答案 0 :(得分:0)
for
循环非常低效。不是每次都重新检索列名,而是执行以下操作:
ResultSetMetaData metaData = rs.getMetaData();
int columns = metaData.getColumnCount();
ArrayList<String> columnNames = new ArrayList<String>();
for (int i = 1; i <= columns; i++) {
columnNames.add(metaData.getColumnName(i));
}
然后,您可以将原始for
循环简化为此(假设您的列名不是null
,这是他们永远不应该的):
for (int i = 0; i < columns; i++)
{
Object cellObject = rs.getObject(columnNames.get(i));
if( cellObject != null )
record.put(cellObject.toString());
}
此外,我不确定您每次拨打al.add(record);
时为什么record
始终指向相同的HashMap
(每次您都会覆盖while
通过record
循环)。请仔细查看您使用{{1}}的方式。
答案 1 :(得分:0)
SQLite是一个嵌入式数据库,不进行任何网络通信;它会动态计算结果记录并忽略提取大小。
如果您的查询很复杂,搜索和计算下一条记录的速度会比较慢。