Как синхронизировать и оптимизировать текстовый индекс Oracle?
мы хотим использовать ctxsys.context
тип индекса для полнотекстового поиска. Но я был весьма удивлен, что индекс такого типа не обновляется автоматически. У нас есть 3 миллиона документов с примерно 10k обновлениями/вставками/удалениями в день.
каковы ваши рекомендации по синхронизации и оптимизации текстового индекса Oracle?
3 ответов
Я думаю, что "синхронизировать каждый" вариант, как описано в предыдущем ответе, доступен только в Oracle 10g или новее. Если вы используете более старую версию Oracle, вам придется периодически запускать операцию синхронизации. Например, можно создать следующую хранимую процедуру:
CREATE OR REPLACE
Procedure sync_ctx_indexes
IS
CURSOR sql1 is select distinct(pnd_index_owner||'.'||pnd_index_name) as index_name from ctx_pending;
BEGIN
FOR rec1 IN sql1 LOOP
ctx_ddl.sync_index(rec1.index_name);
END LOOP;
END;
а затем запланируйте его запуск через DBMS_JOB:
DBMS_JOB.SUBMIT(job_id, 'sync_ctx_indexes;', SYSDATE, 'SYSDATE + 1/720');
что касается оптимизации индекса, можно использовать следующую команду (также можно запланировать с помощью DBMS_JOB или через cron):
alter index my_index rebuild online parameters('optimize full maxtime 60');
там тоже CTX_ * пакет с подобной функцией доступной.
что значит "не обновляется"?
индекс можно синхронизировать при фиксации или периодически.
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC ( ON COMMIT)')
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 'SYNC (EVERY "SYSDATE+1/24")')
Я вам не нужна точность поиска в реальном времени наш DBA рекомендовал синхронизировать индекс периодически, скажем, каждые 2 минуты. Если вы можете позволить себе сделать это за одну ночь, то даже лучше. Что лучше всего зависит от вашей загрузки и размера документа.
эти ссылки, вероятно, могут предоставить вам больше информация:
для Совета DBA, может быть, serverfault лучше?
поместите это здесь как обновление для пользователей Oracle 12C. Если вы используете индекс в режиме реального времени, то он сохраняет элементы в памяти и периодически подталкивает к основным таблицам, что снижает фрагментацию и позволяет искать NRT по потоковому контенту. Вот как его настроить
exec ctx_ddl.drop_preference ( 'your_tablespace' );
exec ctx_ddl.create_preference( 'your_tablespace', 'BASIC_STORAGE' );
exec ctx_ddl.set_attribute ( 'your_tablespace', 'STAGE_ITAB', 'true' );
create index some_text_idx on your_table(text_col) indextype is ctxsys.context PARAMETERS ('storage your_tablespace sync (on commit)')
это настроит индекс в режиме NRT. Это очень мило.