为嵌入式 Derby 重建索引

Rebuilding Indexes for Embedded Derby

我正在使用嵌入式 java 数据库来保存公交时刻表。当新计划可用时,我会自动将新计划加载到数据库表中,然后从数据库中删除旧计划。这会自动发生,无需用户干预。

我注意到数据库随着时间的推移变慢。我有一个脚本可以删除和重建索引(其中有 10 个),在 运行ning 之后,此性能显着提高。目前我手动停止系统,运行脚本然后重启系统。

问题是从 java 代码中重建所有 10 个索引的方法吗?如果有,我会在删除旧时间表后立即执行此操作

SYSCS_UTIL.SYSCS_COMPRESS_TABLE 将重建索引。您可以在非工作时间在重要的 table 上调用此函数。它不应该经常做。 Docs are here.

但是,在执行此操作之前,我会确保慢速查询不会导致全面 table 扫描。即检查以确保您没有遗漏索引。

根据上述建议和文档,以下方法有效。 db 是数据库连接(类型java.sql.Connection)。请注意,table 名称需要大写才能找到。

public void rebuildIndexes(String[] feedTables) throws SQLException {
  String feedTable;
  CallableStatement cs;

  logger.log(Level.INFO, "Reclaiming unused database table space and rebuilding indexes");
  for (int i=(feedTables.length-1); i>=0; i--) {
    feedTable = feedTables[i].toUpperCase();
    logger.log(Level.INFO, String.format("  Rebuilding table %s", feedTable));
    cs = db.prepareCall("CALL SYSCS_UTIL.SYSCS_COMPRESS_TABLE(?, ?, ?)");
    cs.setString(1, "APP");
    cs.setString(2, feedTable);
    cs.setShort(3, (short) 1);
    cs.execute();
    cs.close();
  }
  logger.log(Level.INFO, "Reclaim and rebuild finished");
}