Почему этот недавно созданный текстовый индекс Oracle не работает, пока он не будет перестроен?

Недавно нам пришлось исправить ошибку, из-за которой наши контекстные индексы неправильно индексировали содержимое любого из форматов файлов Office Open XML, которые мы загрузили в нашу базу данных. SQL, который у нас получился, был примерно таким:

BEGIN
  CTX_DDL.CREATE_PREFERENCE('"CX_OBJECT_DST"', 'MULTI_COLUMN_DATASTORE');
  -- DESCRIPTION and FILENAME are both VARCHAR2, OBJECT is a BLOB
  CTX_DDL.SET_ATTRIBUTE('"CX_OBJECT_DST"', 'COLUMNS', 'DESCRIPTION,FILENAME,OBJECT');
  CTX_DDL.SET_ATTRIBUTE('"CX_OBJECT_DST"', 'FILTER', 'N,N,Y');
END;
/

DROP INDEX SCHEMA_NAME.ATTACHMENT_OBJECT_IDX;

CREATE INDEX SCHEMA_NAME.ATTACHMENT_OBJECT_IDX
    ON SCHEMA_NAME.ATTACHMENT (OBJECT)
    INDEXTYPE IS CTXSYS.CONTEXT
    PARAMETERS('datastore CX_OBJECT_DST')
    NOPARALLEL;

ALTER INDEX SCHEMA_NAME.ATTACHMENT_OBJECT_IDX REBUILD;

Это в базе данных Oracle 11.2.0.4.

На первый взгляд перестроение индекса сразу после его создания кажется нелогичным. Но мы обнаружили, что если мы опустим REBUILD, индекс не подберет содержимое загруженных нами вложений.

Я не понимаю, почему это так (хотя я первым признаю, что мои познания в этой области невелики). Что REBUILD делает, а CREATE не делает, чтобы это работало?

Всякий раз, когда кто-то спрашивает, почему мы делаем перестроение сразу после создания, все, что мы можем ответить на данный момент, это «потому что это не работает, если мы этого не делаем», что не очень удовлетворительный ответ услышать (или дать в этом отношении) ...


У нас есть фоновое задание, которое запускается раз в минуту и ​​вызывает хранимую процедуру, которая вызывает:

CTX_DDL.SYNC_INDEX('ATTACHMENT_OBJECT_IDX');

Сама процедура просто включает в себя некоторый код обработки исключений и этот один вызов - ничего, что должно на это повлиять.

Мы перевели работу в автономный режим, пока индекс был удален и воссоздан, а затем выкупили его обратно в сети после того, как он был завершен. Затем мы оставили эту работу на несколько минут, чтобы убедиться, что она не дала сбой (а это было не так), а затем загрузили наш файл .docx в базу данных. Мы снова подождали, пока задание запустится, и убедились, что оно не дало сбоев (опять же, все было в порядке), затем попытались найти содержимое этого загруженного файла, что всегда не дало результатов.

Если мы затем выполним REBUILD для этого индекса, файл будет проиндексирован, и все новые файлы с этого момента также будут проиндексированы должным образом. Если мы этого не сделаем, кажется, что это никогда не сработает (NB: мы также пытались оставить задание в сети, пока индекс был удален и воссоздан, но не ожидали, что это сработает - и это не сработало).


person JonK    schedule 19.06.2014    source источник
comment
проверьте просмотр ошибок индекса docs.oracle.com/cd /B28359_01/text.111/b28303/ind.htm#i1007466, а также этот stackoverflow.com/questions/1916244/   -  person Tomasz    schedule 21.06.2014
comment
@Tomasz На самом деле я уже читал документацию по оракулу, но я просмотрел ее снова, просто чтобы посмотреть, не пропустил ли я что-нибудь в первый раз. Эта строка представляет интерес: Как правило, перестроение индекса не имеет преимуществ перед его удалением и повторным созданием с помощью CREATE INDEX.   -  person JonK    schedule 21.06.2014
comment
ну да, но поскольку вы синхронизируете, не должно быть необходимости в его восстановлении. Когда вы в конце концов выясните это, напишите ответ!   -  person Tomasz    schedule 23.06.2014