Pergunta

Queremos usar um ctxsys.context Tipo de índice para pesquisa completa de texto. Mas fiquei bastante surpreso, que um índice desse tipo não seja atualizado automaticamente. Temos 3 milhões de documentos com cerca de 10 mil atualizações/inserções/exclusão por dia.

Quais são as suas recomendações para sincronizar e otimizar um índice de texto do Oracle?

Foi útil?

Solução

Eu acho que 'sincronize todas as opções', conforme descrito na resposta anterior, disponível apenas no Oracle 10G ou mais recente. Se você estiver usando a versão mais antiga do Oracle, teria que executar a operação de sincronização periodicamente. Por exemplo, você pode criar o seguinte procedimento armazenado:

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;

e depois agende -o executado via dbms_job:

DBMS_JOB.SUBMIT(job_id, 'sync_ctx_indexes;', SYSDATE, 'SYSDATE + 1/720');

Quanto à otimização do índice, o comando seguinte pode ser usado (também pode ser agendado com dbms_job ou via cron):

alter index my_index rebuild online parameters('optimize full maxtime 60');

Há também o pacote ctx_* com função semelhante disponível.

Outras dicas

O que você quer dizer com "não atualizado automaticamente"?

O índice pode ser sincronizado no comprometimento ou periodicamente.

Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC ( ON COMMIT)')
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 'SYNC (EVERY "SYSDATE+1/24")')

Eu não precisa de precisão de pesquisa em tempo real que nosso DBA recomendou para sincronizar o índice periodicamente, digamos a cada 2 minutos. Se você puder fazer isso da noite para o dia, ainda melhor. O que é melhor depende da sua carga e do tamanho do documento.

Esses links provavelmente podem fornecer mais informações:

Para conselhos sobre DBA, talvez o ServerFault seja melhor?

Colocando isso aqui como uma atualização para usuários do Oracle 12C. Se você usar o índice no modo em tempo real, ele mantém itens na memória e empurra periodicamente para as tabelas principais, o que mantém a fragmentação e permite a pesquisa de NRT no conteúdo de streaming. Veja como configurá -lo

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)')

Isso configurará o índice no modo NRT. É muito doce.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top