【问题标题】:Rebuilding Indexes for Embedded Derby为嵌入式 Derby 重建索引
【发布时间】:2017-10-18 16:07:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: derby


    【解决方案1】:

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

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

    【讨论】:

    • 欢迎来到 Stack Overflow @paulh。如果它有效,你应该接受答案,这就是人们在未来寻找的东西。
    【解决方案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");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 2021-08-01
      • 2020-09-18
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多