Как синхронизировать и оптимизировать текстовый индекс Oracle?
-
20-09-2019 - |
Вопрос
Мы хотим использовать 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.Это довольно мило.