Как синхронизировать и оптимизировать текстовый индекс 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. Это очень мило.