Корректировка индекса
Функция
Определение оператора корректировки индекса.
Спецификация
::=
ON [имя схемы.]имя таблицы
FOR {ROWID номер записи
| [FILE номер файла] PAGE номер страницы [WITH TEST]}
[WAIT |NOWAIT]
Синтаксические правила
-
<Имя столбца>
должно соответствовать столбцу таблицы, по которому ранее был создан индекс (по командеCREATE INDEX
или автоматически при объявлении столбцаPRIMARY KEY
). -
<Имя индекса>
должно задавать один из ранее созданных именованных индексов данной таблицы. -
Если индекс создавался как неименованный, то вместо
<имени индекса>
необходимо использовать<имя столбца>
. -
Если
<номер файла>
не указан, по умолчанию используется1
. -
Отсчет номеров файлов и страниц начинается с
1
. -
Опция
WITH TEST
зарезервирована для дальнейшего использования. -
<Номер файла>
задает номер индексного файла таблицы. Если он не задан, по умолчанию используется1
. -
<Номер страницы>
задает номер страницы индексного файла, которая должна быть откорректирована.Примечание
Значения
<номер файла>
и<номер страницы>
можно получить с помощью утилиты testdb (см. документ «СУБД ЛИНТЕР. Тестирование базы данных», пункт «Вывод в файл ROWID по экстенту файла таблицы»). Сама утилита 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 (см. документ «СУБД ЛИНТЕР. Командный интерфейс», подраздел «SHOW»).
-
Если не задан модификатор
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 («Нельзя исправить одну указанную страницу»). В этом случае необходима полная перестройка индекса.