Domanda

Vogliamo usare un tipo di indice ctxsys.context per ricerca a testo integrale. Ma sono stato molto sorpreso, che un indice di questo tipo non viene aggiornato automaticamente. Abbiamo 3 milioni di documenti con circa 10k aggiornamenti / inserti / eliminazioni al giorno.

Quali sono le vostre raccomandazioni per la sincronizzazione e l'ottimizzazione di un indice testo di Oracle?

È stato utile?

Soluzione

opzione 'SYNC OGNI' Credo che, come descritto nella risposta precedente disponibile solo in Oracle 10g o più recente. Se si sta utilizzando la versione precedente di Oracle si dovrebbe eseguire periodicamente un'operazione di sincronizzazione. Ad esempio, è possibile creare stored procedure seguente:

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 quindi pianificare correre via DBMS_JOB:

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

Per quanto riguarda l'ottimizzazione dell'indice, a seguito di comando può essere utilizzato (anche possono essere programmati con DBMS_JOB o via cron):

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

C'è anche CTX_ * pacchetto con funzione analoga a disposizione.

Altri suggerimenti

Che cosa si intende per "non aggiornato automaticamente"?

L'indice può essere sincronizzato su commit o 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")')

I non hai bisogno in tempo reale la precisione di ricerca il nostro DBA consiglia di sincronizzare periodicamente l'indice, dire ogni 2 min. Se si può permettersi di farlo durante la notte, quindi ancora meglio. Che cosa è meglio dipende dal vostro carico e le dimensioni del documento.

Questi link possono probabilmente fornirvi ulteriori informazioni:

Per consigli DBA, forse è meglio serverfault?

Mettendo questo qui come un aggiornamento per gli utenti Oracle 12C. Se si utilizza l'indice in tempo reale, quindi mantiene gli elementi in memoria, e periodicially spinge alle tabelle principali, che mantiene la frammentazione verso il basso e permette NRT ricerca su contenuti in streaming. Ecco come configurarlo

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

questo sarà istituito l'indice in modalità NRT. E 'abbastanza dolce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top