我正在用 Java 创建一个应用程序,它使用 SQLite 在数据库中存储和搜索数据。
我不确定我是否以最有效的方式解决这个问题,我想这里有人可以帮助我解决这个问题。
背景信息: 我的 Java 应用程序使用一个库来解析 .PDF 文件,该库可以将原始文本从 PDF 文件转换为 StringWriter。然后,我解析结果数据并获取在数据库中创建一些新行所需的信息。不过,生成的表格非常大,因为需要解析大约 900 个 PDF 文件。只是为了让您了解我所说的有多大,其中一个表最终有大约 145000 行,另一个表有 1550 行,其他表(3 或 4 个其他表)有 75 到 750 行。
一切正常,但我不确定是否可以减少创建表和内容所需的时间。到目前为止,在我的笔记本电脑上,第一次创建所有内容需要 41 分钟(尽管所有内容都从 USB 闪存驱动器运行......稍后我将在 HDD 上进行测试)。当我再次运行它时,需要 1.5 分钟,因为它会检查文件是否已被解析并且不会重新创建所有内容。我不需要它是一个巨大的改进,因为理想情况下我每周只运行这个程序一次,大约有 30 个文件左右,但我仍然想知道为什么它在 900 个文件时如此慢;如果是解析文件的代码很慢,或者在 SQLite 部分这对我来说是不好的做法。 (我正在使用去年创建的所有文件进行测试,这就是我有这么多文件的原因)
那么,提高 Java 中 SQLite 性能的最佳实践是什么?将自动提交设置为 false 并仅在创建所有内容后才提交会产生明显的差异吗?有没有一种方法可以更有效地创建语句或测试数据是否已经存在?
我没有携带代码,但查询看起来有点像这样:
public static void insertScores(String league, int playerID, int score, String date)
{
PreparedStatement ps = new PreparedStatement("INSERT INTO Scores(?,?,?,?)");
ps.setString(1, league);
[...]
ps.executeUpdate();
}
在其他查询中,我使用如下方式测试该行是否已存在:
public static void insertScores(int playerID)
{
ResultSet rs = null;
PreparedStatement ps = new PreparedStatement("SELECT * FROM Scores WHERE ID = ?");
ps.setInt(1, playerID);
rs = ps.executeQuery();
if(!rs.next())
{
[code like in the first example]
}
}
请记住,语法错误是因为我只是用心输入此内容,因为我没有携带代码。
通过查看这些示例并阅读我所说的内容,有人知道如何提高 SQL 语句的性能吗?
最佳答案
两个建议:
1) 获取一个分析器。您可以猜测是什么让您的代码变慢,或者您可以只分析它并知道是什么让它变慢。
2) 由于您的数据位于速度较慢的设备上,因此您希望尽可能少地读取/写入。 SELECT *
返回整行,但随后您只需检查是否存在。尝试SELECT ID
,它只需要读取一个数字。
关于java - Java中的SQLite : Ways to optimize my queries to make them return faster?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6442403/