Używamy indeksu Oracle Text CTXSYS.CONTEXT do indeksowania około pół miliona wierszy zawierających metainformację. Informacje są rozłożone na dwie tabele, które są połączone przez procedurę, którą wywoływacz wywołuje w czasie wykonywania (indeks funkcjonalny).Przyspiesz indeksowanie Oracle Text lub pozwól indeksatorowi pracować tylko przy niskich czasach ładowania
Po uruchomieniu CREATE INDEX na moim komputerze lokalnym (zwykły notebook dualcore) indeks jest budowany w ciągu około 3 minut. Na naszym serwerze DB, który działa na systemie Solaris z 8 rdzeniami i 16 GB pamięci RAM, utworzenie całego indeksu dla tych samych (dokładnie takich samych) danych zajmuje około 24 godzin. Kod
Próbka: To jest nasz podajnik indeks dla dwóch tabel i 3 kolumny:
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
Są preferencje
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;
Teraz możemy utworzyć indeks
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;
Dane składają się głównie z prostego tytułu lub nazwiska autora + krótki opis z tekstem < 1k.
Próbowałem trochę zagrać z włączonymi ustawieniami pamięci i parametrem PARALLEL, ale nie odniosłem żadnego sukcesu. Oto moje pytania:
- Czy istnieje sposób na wstrzymanie i wznowienie procesu indeksowania (mam do dyspozycji rolę CTX_SYS)?
- ma ktoś podpowiedź, który parametr można poprawić (szczególnie rozmiar pamięci)?
- Czy można eksportować i importować indeks tekstowy? -> wtedy mógłbym przeprowadzić indeksowanie na mojej lokalnej maszynie i po prostu skopiować go na nasz serwer
- czy indeksator może działać z "niższym priorytetem"?
- Możliwe jest, że indeksowanie zostało zakłócone przez operacje blokowania (jest to maszyna pośrednicząca, do której inni mają dostęp równolegle). Czy istnieje sposób na zablokowanie zaangażowanych tabel, utworzenie indeksu i odblokowanie ich później?
Dziękuję za twoje badania. – egor7
Świetne napisy, zajęło mi tygodnie, aby dowiedzieć się tyle. Jednak populate_pending POPULUJE listę aktualizacji indeksu PENDING z wszystkimi wierszami/dokumentami w tabeli źródłowej. Oracle nie ma pojęcia, co mogło się zmienić, w końcu śledzenie tego, co się zmieniło, jest dokładnie tym, za co odpowiada CTXSYS.DR $ PENDING. Użyj tego tylko podczas tworzenia indeksu lub jeśli chcesz ponownie zindeksować wszystko. – Roy