Наконец-то мы выяснили, как выполнить разделенную синхронизацию индекса.Вот несколько основных шагов, которые показывают, что мы сделали:
CREATE INDEX concat_DM_RV_idx ON DOCMETA (FULLTEXTIDX_DUMMY)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('datastore concat_DM_RV_DS section group CTXSYS.AUTO_SECTION_GROUP
NOPOPULATE
');
см. Параметр NOPOPULATE?это говорит индексатору, что он не должен запускать процесс заполнения / индексации.Если вы на 11g, у вас есть очень хорошая функция CTX_DDL, которая заполняет индекс по желанию, а именно процедура «POPULATE_PENDING».Вызов его по имени индекса заполняет таблицу CTXSYS, в которой хранятся строки, которые были изменены и, следовательно, не синхронизированы.Обратите внимание, что после вызова этого метода индексатор все еще ничего не запускает.Начиная с 10g (?) Соответствующая процедура CTX_DDL.SYNC_INDEX имеет несколько дополнительных параметров, например, параметр «maxtime».Предоставьте ему, скажем, 4H, и ваш индексатор начнет синхронизировать ожидающие строки в течение примерно 4 часов.Вы повторяете эту процедуру по расписанию, и все готово.
К сожалению, это не работает в 9i.Поэтому мы попытались «смоделировать» процесс Oracle POPULATE_PENDING.Единственное ограничение для этого метода: вам нужен какой-то уникальный идентификатор строки, чтобы иметь возможность запрашивать куски того же контента из вашей таблицы.Вот что мы сделали:
1.) Создайте индекс с помощью NOPOPULATE (см. Выше) 2.) Станьте SYS / DBA / CTXSYS (да, вы можете позвонить своему администратору для этого).Найдите идентификатор, который имеет только что созданный вами индекс, с помощью запроса к таблице метаданных индекса:
SELECT IDX_ID FROM CTXSYS.CTX_INDEXES WHERE IDX_NAME ='concat_DM_RV_idx';
3.) Запишите идентификатор индекса, который это дает на желтом фрагменте бумаги, и выполните этот оператор вставки как роль CTXSYS.и замените <> вашим идентификатором индекса, а <> именем таблицы, на которой построен индекс.Уникальный идентификатор строки может быть идентификатором документа или счетным оператором любого типа, который создает уникальный фрагмент данных вашей таблицы:
INSERT INTO CTXSYS.DR$PENDING (PND_CID,PND_PID,PND_ROWID,PND_TIMESTAMP)
SELECT <<your index id>>, 0, <<basetable name>>.ROWID, CURRENT_DATE
FROM gsms.DOCMETA
WHERE <<basetable unique row identifier>> < 50000;
COMMIT; -- Dont forget the COMMIT! DONT FORGET IT!!! WE MEAN IT!
«50.000» обозначает количество строк в зависимости от дефицитавашей базовой таблицы, которая будет вставлена в таблицу ожидающих строк в качестве полезной нагрузки для индексатора.Отрегулируйте его под свои нужды.
4.) Теперь мы настроены на освобождение индексатора.
CALL CTX_DDL.SYNC_INDEX(
'CONCAT_DM_RV_IDX', -- your index name here
'100M', -- memory count
NULL, -- param for partitioned idxes
2 -- parallel count
);
запустит процесс индексации для любого количества строк, вставленных на шаге 3.) Для запуска следующегоповторить шаг 3.) со следующими примерно 50 000 строк («где id между 50 000 и 100 000»)
Если вы случайно запустите индексатор для того же набора строк, индекс будет сильно фрагментирован.Единственный способ очистить его - оптимизировать индекс с помощью параметра REBUILD.На нашей локальной машине это было очень быстро, так как индексатор не должен работать, а только переупорядочивает содержимое таблиц индекса:
CALL CTX_DDL.OPTIMIZE_INDEX('CONCAT_DM_RV_IDX', 'REBUILD');
Если вам нужна мета-информация о состоянии и размере индексации, вы можете спроситьпакет CTX_REPORT:
SELECT CTX_REPORT.INDEX_SIZE('CONCAT_DM_RV_IDX') FROM DUAL;
И если вы забыли, какие параметры вы выбрали во время индексации:
SELECT * FROM CTXSYS.CTX_PARAMETERS;
Удачной индексации!