Мы используем индекс Oracle Text CTXSYS.CONTEXT для индексации около полумиллиона строк, содержащих метаинформацию. Информация распространяется на две таблицы, которые объединены процедурой, которую вызывает индексатор во время выполнения (функциональный индекс).
Когда я запускаю CREATE INDEX на моей локальной машине (простой двухъядерный ноутбук), индекс создается примерно через 3 минуты. На нашем сервере БД, который работает на Solaris с 8 ядрами и 16 ГБ ОЗУ, требуется 24 часа для создания индекса для тех же (точно таких же) данных.
Пример кода: Это наш индексный фидер для двух таблиц и трех столбцов:
create or replace procedure docmeta_revisions_text_feeder
( p_rowid in rowid , p_clob in out nocopy clob) as v_clob CLOB begin
FOR c1 IN (select DM.DID, DM.XDESCRIB || ' ' || DM.XAUTHOR AS data
from DOCMETA DM
WHERE ROWID = p_rowid)
LOOP
v_clob := v_clob || c1.data;
FOR c2 IN (
SELECT ' ' || RV.DDOCTITLE AS data
FROM REVISIONS RV
WHERE RV.DID = c1.DID)
LOOP
v_clob := v_clob || c2.data;
END LOOP;
END LOOP;
p_clob := v_clob;
end docmeta_revisions_text_feeder
Это настройки
BEGIN
CTX_DDL.CREATE_PREFERENCE ('concat_DM_RV_DS', 'USER_DATASTORE');
CTX_DDL.SET_ATTRIBUTE ('concat_DM_RV_DS', 'PROCEDURE',
'docmeta_revisions_text_feeder');
END;
Теперь мы создаем индекс
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
') PARALLEL 4;
Данные в основном состоят из простого названия или имени автора + краткое описание с < 1k.
Я попытался немного поиграть с задействованными параметрами памяти и параметром PARALLEL, но не имел успеха. Итак, вот мои вопросы:
- Есть ли способ приостановить и возобновить процесс индексирования (у меня есть роль CTX_SYS)?
- У кого-нибудь есть подсказка, какой параметр можно настроить (например, размер памяти)?
- Можно ли экспортировать и импортировать текстовый индекс? → Затем я смог выполнить индексацию на своей локальной машине и просто скопировать ее на наш сервер
- может ли указатель работать с "более низким приоритетом"?
- возможно, что индексатор был нарушен операциями блокировки (это промежуточная машина, в которой другой доступ осуществляется параллельно). Есть ли способ заблокировать задействованные таблицы, создать индекс и разблокировать их впоследствии?