Come sincronizzare e ottimizzare un indice di testo di Oracle?
-
20-09-2019 - |
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?
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.