Корректировка индекса

Функция

Определение оператора корректировки индекса.

Спецификация
   
< корректировка индекса >::=
Синтаксические правила
  1. < Имя столбца > должно соответствовать столбцу таблицы, по которому ранее был создан индекс (по команде CREATE INDEX или автоматически при объявлении столбца PRIMARY KEY).

  2. < Имя индекса > должно задавать один из ранее созданных именованных индексов данной таблицы.

  3. Если индекс создавался как неименованный, то вместо < имени индекса > необходимо использовать < имя столбца >.

  4. Если < номер файла > не указан, по умолчанию используется 1.

  5. Отсчет номеров файлов и страниц начинается с 1.

  6. Опция WITH TEST зарезервирована для дальнейшего использования.

  7. < Номер файла > задает номер индексного файла таблицы. Если он не задан, по умолчанию используется 1.

  8. < Номер страницы > задает номер страницы индексного файла, которая должна быть откорректирована.

    Примечание

    Значения < номер файла > и < номер страницы > можно получить с помощью утилиты testdb (см. документ «СУБД ЛИНТЕР. Тестирование базы данных», пункт «Вывод в файл ROWID по экстенту файла таблицы»). Сама утилита testdb такие ошибки БД не исправляет.

  9. < Номер записи > задает системный номер записи (ROWID), для которой должен быть скорректирован индекс.

    correct index make on auto for rowid 100;
  10. Имена таблиц, столбцов/индексов и номера ROWID, для которых нужно сделать корректировку индекса, можно получить с помощью SQL-команды TEST TABLE или утилиты TESTDB.

    Пример протокола утилиты testdb (с ключом -le):

    ...
    * ERROR
    * Table #47, ROWID #9059427, column #1 index
    index file #1 page #151271
    * Index contains invalid value
    * ERROR
    * Table #47, converter ROWID #9091145, column #1 index
    * ROWID not found in index
    * ERROR
    * Table #47, converter ROWID #9092958, column #1 index
    * ROWID not found in index
    ...

    В данном случае имеет смысл выполнить команду CORRECT INDEX для значений ROWID 9059427, 9091145, 9092958.

    Получить имя таблицы и столбца можно по запросу:

    select trim($$$s13), trim($$$s23)
      from $$$sysrl,$$$attri
     where $$$sysrl.$$$s11=$$$attri.$$$s21
       and $$$s11=47
       and $$$attri.$$$s22=1;
  11. Получить список индексов можно по команде show утилиты inl (см. документ «СУБД ЛИНТЕР. Командный интерфейс», подраздел «SHOW»).

  12. Если не задан модификатор WAIT (NOWAIT), по умолчанию используется WAIT.

Общие правила
  1. Если указана конструкция FOR ROWID:

    • команда исправляет в указанном индексе элементы, относящиеся к заданному системному номеру записи (ROWID), удаляя при необходимости неправильные элементы и добавляя правильные;

    • если указанного ROWID нет в таблице, и нет никаких элементов индекса с таким ROWID, выдается код завершения 714 («Несуществующий ROWID – нельзя исправить индекс»);

    • при выполнении команды индекс не блокируется (блокируется только ROWID записи).

  2. Конструкция FOR FILE… PAGE используется при появлении массовых ошибок, связанных с индексами (фиксируются в файле протоколирования linter.out), либо по результатам тестирования БД утилитой testdb (эта утилита всего лишь выявляет дефекты в индексах, но не устраняет их).

  3. Необходимые для команды значения можно получить с помощью утилиты testdb.

    Пример протокола утилиты testdb (с ключом -lr):
    Таблица #48, составной индекс #1, узел #33554917
    · *  Неверный заголовок страницы
    
    · В этом случае параметры для команды будут следующие:
    · < номер файла >: 2
    · < номер страницы >: 485
    Для извлечения < номера файла > и < номера страницы > из значения узла:
    · преобразовать значение узла в шестнадцатеричный вид (например,
    · 33554917 = 0x200001E5);
    · взять первую цифру полученного значения (это номер файла), например, 0x2 = 2,
     и преобразовать её в десятичный вид;
    · взять оставшиеся цифры полученного значения (это номер страницы), например,
     0x1E5, и преобразовать их в десятичный вид (в данном примере это 485).
  4. Если указанная страница не найдена в указанном индексе, выдается код завершения 1131 («Страница не найдена в индексе»). Этот же код завершения выдается и в том случае, если индекс состоит только из одной страницы, в этом случае рекомендуется полностью перестроить индекс.

  5. Если перестройка отдельной указанной индексной страницы не может быть выполнена – выдается код завершения 1132 («Нельзя исправить одну указанную страницу»). В этом случае необходима полная перестройка индекса.