Корректировка индекса (CORRECT INDEX)
Функция
Определение оператора корректировки индекса.
Спецификация
::=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 («Нельзя исправить одну указанную страницу»). В этом случае необходима полная перестройка индекса.