java - Java中的SQLite : Ways to optimize my queries to make them return faster?

标签 java sqlite

我正在用 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/

相关文章:

java - 了解 map 获取方法

java - 使用java AWT确定标题窗口7的大小

java - 如何在 Java 程序中获取 "ribbon"UI 组件,例如在 Office 2007 中?

java - 在 Java 中,为什么我可以不处理某些类型的异常而不处理其他类型的异常呢?

sqlite - SQLite如何为所有情况随机选择最小值?

java - 在不同的类层次结构中重用相同的类

android - 在一个线程上关闭 SQLite 数据库会破坏在另一个线程上打开的数据库

Android:关闭 SQLite 数据库

javascript - 使用外部插件在 react-native 中开 Jest 测试用例错误

java - 我应该在哪里/什么时候创建一个表作为我的程序的基础?