Как синхронизировать и оптимизировать текстовый индекс Oracle?

StackOverflow https://stackoverflow.com/questions/1916244

Вопрос

Мы хотим использовать ctxsys.context тип индекса для полнотекстового поиска.Но я был весьма удивлен, что индекс такого типа не обновляется автоматически.У нас есть 3 миллиона документов с примерно 10 тысячами обновлений / вставок / удалений в день.

Каковы ваши рекомендации по синхронизации и оптимизации текстового индекса Oracle?

Это было полезно?

Решение

Я думаю, что опция "СИНХРОНИЗИРОВАТЬ ВСЕ", как описано в предыдущем ответе, доступна только в 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")')

Если вам не нужна точность поиска в реальном времени, наш администратор базы данных рекомендовал периодически синхронизировать индекс, скажем, каждые 2 минуты.Если вы можете позволить себе сделать это за одну ночь, тогда еще лучше.То, что лучше всего, зависит от вашей загрузки и размера документа.

Эти ссылки, вероятно, могут предоставить вам дополнительную информацию:

По совету администратора базы данных, может быть, 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.Это довольно мило.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top