Stiamo utilizzando un indice CTXSYS.CONTEXT di Oracle Text per indicizzare circa mezzo milione di righe contenenti metainformazioni. Le informazioni sono distribuite su due tabelle combinate da una procedura che l'indicizzatore chiama in fase di runtime (indice funzionale).Accelerare l'indicizzazione di Oracle Text o lasciare che l'indicizzatore funzioni solo su tempi di caricamento bassi
Quando eseguo CREATE INDEX sulla mia macchina locale (notebook dualcore semplice) l'indice è costruito in circa 3 minuti. Sul nostro server DB che gira su Solaris con 8 core e 16G di RAM ci vogliono circa 24 ore per creare un indice per gli stessi (esattamente identici) dati. Codice
Esempio: Questo è il nostro alimentatore indice per due tavoli e 3 colonne:
create or replace procedure docmeta_revisions_text_feeder
(p_rowid in rowid , p_clob in out nocopy clob) as v_clob CLOB begin
FOR c1 IN (select DM.DID, DM.XDESCRIB || ' ' || DM.XAUTHOR AS data
from DOCMETA DM
WHERE ROWID = p_rowid)
LOOP
v_clob := v_clob || c1.data;
FOR c2 IN (
SELECT ' ' || RV.DDOCTITLE AS data
FROM REVISIONS RV
WHERE RV.DID = c1.DID)
LOOP
v_clob := v_clob || c2.data;
END LOOP;
END LOOP;
p_clob := v_clob;
end docmeta_revisions_text_feeder
Queste sono le preferenze
BEGIN
CTX_DDL.CREATE_PREFERENCE ('concat_DM_RV_DS', 'USER_DATASTORE');
CTX_DDL.SET_ATTRIBUTE ('concat_DM_RV_DS', 'PROCEDURE',
'docmeta_revisions_text_feeder');
END;
Ora creiamo l'indice
CREATE INDEX concat_DM_RV_idx ON DOCMETA (FULLTEXTIDX_DUMMY)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('datastore concat_DM_RV_DS
section group CTXSYS.AUTO_SECTION_GROUP
') PARALLEL 4;
I dati consistono principalmente in un semplice titolo o nome dell'autore + una breve descrizione con < 1k testo.
Ho provato a giocare un po 'con le impostazioni di memoria coinvolte e il parametro PARALLEL ma non ho avuto successo. Quindi, ecco che arrivano le mie domande:
- c'è un modo per mettere in pausa e riprendere un processo di indicizzazione (ho il ruolo CTX_SYS a portata di mano)?
- Qualcuno ha un suggerimento su quale parametro potrebbe essere modificato (in particolare la dimensione della memoria)?
- è possibile esportare e importare un indice di testo? -> allora potrei eseguire l'indicizzazione sul mio computer locale e semplicemente copiarlo sul nostro server
- un indicizzatore può essere eseguito con "priorità inferiore"?
- è possibile che l'indicizzatore sia stato disturbato dalle operazioni di blocco (è una macchina di staging che l'altro accede in parallelo). C'è un modo per bloccare le tabelle coinvolte, creare l'indice e sbloccarle in seguito?
Grazie per la tua ricerca. – egor7
Un bel riassunto, mi ci sono voluti settimane per capirlo. Tuttavia, popola_pending POPOLA l'elenco degli aggiornamenti dell'indice PENDING con TUTTE le righe/i documenti nella tabella di origine. Oracle non ha idea di cosa potrebbe essere cambiato, dopo tutto, tenere traccia di ciò che è cambiato è esattamente ciò che CTXSYS.DR $ PENDING è per. Usalo solo quando crei l'indice o se vuoi reindicizzare tutto. – Roy