我正在使用嵌入式java数据库来保存总线时间表。当新计划可用时,我会自动将新计划加载到数据库表中,然后从数据库中删除旧计划。无需用户干预即可自动完成。
我注意到数据库随着时间的推移而变慢。我有一个删除和重建索引的脚本(其中有10个),运行后这个性能显着提高。目前,我手动停止系统,运行脚本,然后重新启动系统。
问题是从java代码中重建所有10个索引的方法吗?如果有,我会在删除旧时间表后立即执行此操作
答案 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");
}