为嵌入式 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");
}
我正在使用嵌入式 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");
}