Определение оператора корректировки индекса.
::=
<Имя столбца>
должно соответствовать столбцу таблицы, по которому ранее был создан индекс (по команде CREATE INDEX
или автоматически при объявлении столбца PRIMARY KEY
).
<Имя индекса>
должно задавать один из ранее созданных именованных индексов данной таблицы.
Если индекс создавался как неименованный, то вместо <имени индекса>
необходимо использовать <имя столбца>
.
Если <номер файла>
не указан, по умолчанию используется 1
.
Отсчет номеров файлов и страниц начинается с 1
.
Опция WITH TEST
зарезервирована для дальнейшего использования.
<Номер файла>
задает номер индексного файла таблицы. Если он не задан, по
умолчанию используется 1
.
<Номер страницы>
задает номер страницы индексного файла, которая должна быть откорректирована.
Значения <номер файла>
и <номер страницы>
можно получить с помощью утилиты
testdb (см. документ «СУБД ЛИНТЕР. Тестирование базы данных»). Сама утилита
testdb такие ошибки БД не исправляет.
<Номер записи>
задает системный номер записи (ROWID
), для которой должен быть скорректирован индекс.
correct index make on auto for rowid 100;
Имена таблиц, столбцов/индексов и номера 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;
Получить список индексов можно по команде show утилиты inl (см. документ «СУБД ЛИНТЕР. Командный интерфейс»).
Если не задан модификатор WAIT
(NOWAIT
), по умолчанию используется WAIT
.
Если указана конструкция FOR ROWID
:
команда исправляет в указанном индексе элементы, относящиеся к заданному системному номеру записи (ROWID
), удаляя при необходимости неправильные элементы и добавляя правильные;
если указанного ROWID
нет в таблице, и нет никаких элементов индекса с таким ROWID
, выдается код завершения 714 («Несуществующий ROWID – нельзя исправить индекс»);
при выполнении команды индекс не блокируется (блокируется только ROWID
записи).
Конструкция FOR FILE… PAGE
используется при появлении массовых ошибок,
связанных с индексами (фиксируются в файле протоколирования linter.out
), либо
по результатам тестирования БД утилитой testdb (эта утилита всего лишь выявляет
дефекты в индексах, но не устраняет их).
Необходимые для команды значения можно получить с помощью утилиты testdb.
Пример протокола утилиты testdb (с ключом -lr): Таблица #48, составной индекс #1, узел #33554917 · * Неверный заголовок страницы · В этом случае параметры для команды будут следующие: · <номер файла>: 2 · <номер страницы>: 485 Для извлечения <номера файла> и <номера страницы> из значения узла: · преобразовать значение узла в шестнадцатеричный вид (например, · 33554917 = 0x200001E5); · взять первую цифру полученного значения (это номер файла), например, 0x2 = 2, и преобразовать её в десятичный вид; · взять оставшиеся цифры полученного значения (это номер страницы), например, 0x1E5, и преобразовать их в десятичный вид (в данном примере это 485).
Если указанная страница не найдена в указанном индексе, выдается код завершения 1131 («Страница не найдена в индексе»). Этот же код завершения выдается и в том случае, если индекс состоит только из одной страницы, в этом случае рекомендуется полностью перестроить индекс.
Если перестройка отдельной указанной индексной страницы не может быть выполнена – выдается код завершения 1132 («Нельзя исправить одну указанную страницу»). В этом случае необходима полная перестройка индекса.