重建嵌入式Derby的索引

时间:2017-10-18 16:07:44

标签: derby

我正在使用嵌入式java数据库来保存总线时间表。当新计划可用时,我会自动将新计划加载到数据库表中,然后从数据库中删除旧计划。无需用户干预即可自动完成。

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

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

2 个答案:

答案 0 :(得分:3)

SYSCS_UTIL.SYSCS_COMPRESS_TABLE将重建索引。您可以在非工作时间在重要的桌子上调用此功能。它不应该经常进行。 Docs are here

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

答案 1 :(得分:2)

基于上述建议和文档,以下方法有效。 db 是数据库连接(类型为java.sql.Connection)。请注意,需要将表名称设置为大写。

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");
}