Перестроение индексов для Embedded Derby

Я использую встроенную базу данных Java для хранения расписаний автобусов. Когда новое расписание становится доступным, я автоматически загружаю новое расписание в таблицы базы данных, а затем удаляю старые расписания из базы данных. Это происходит автоматически без вмешательства пользователя.

Я заметил, что база данных со временем замедляется. У меня есть скрипт, который сбрасывает и перестраивает индексы (их 10), и после запуска производительность значительно улучшается. В настоящее время я вручную останавливаю систему, запускаю скрипт и затем перезапускаю систему.

Вопрос в том, есть ли способ перестроить все 10 индексов из java-кода? Если бы был, я бы сделал это сразу после удаления старых расписаний


person paulh    schedule 18.10.2017    source источник


Ответы (2)


SYSCS_UTIL.SYSCS_COMPRESS_TABLE перестроит индексы. Вы можете вызывать эту функцию на важных столах в нерабочее время. Не следует делать это часто. Документы здесь.

Однако перед этим я хотел бы убедиться, что медленные запросы не приводят к сканированию всей таблицы. то есть проверьте, не пропустили ли вы индекс.

person Bill    schedule 18.10.2017
comment
Добро пожаловать в Stack Overflow @paulh. Если это сработало, вы должны принять ответ, это то, что люди ищут в будущем. - person Bill; 19.10.2017

На основе приведенного выше предложения и документации работает следующий метод. 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");
}
person paulh    schedule 19.10.2017