Tekst Oracle
1 — Możesz poprawić wydajność, tworząc indeks KONTEKST za pomocą funkcji FILTER BY:
create index my_idx on my_table(text) indextype is ctxsys.context filter by group_id;
W moich testach filter by
zdecydowanie poprawiło wydajność, ale nadal trochę szybciej było po prostu użyć indeksu btree na group_id.
2 – Indeksy CTXCAT używają „podindeksów” i wydają się działać podobnie do indeksu wielokolumnowego. Wygląda na to, że jest to opcja (4), której szukasz:
begin
ctx_ddl.create_index_set('my_table_index_set');
ctx_ddl.add_index('my_table_index_set', 'group_id');
end;
/
create index my_idx2 on my_table(text) indextype is ctxsys.ctxcat
parameters('index set my_table_index_set');
select * from my_table where catsearch(text, 'blah', 'group_id = 43') > 0
To prawdopodobnie najszybsze podejście. Użycie powyższego zapytania do 120 MB losowego tekstu podobnego do scenariusza A i B wymagało tylko 18 spójnych pobrań. Ale z drugiej strony utworzenie indeksu CTXCAT zajęło prawie 11 minut i zajęło 1,8 GB miejsca.
(Uwaga:Oracle Text wydaje się działać tutaj poprawnie, ale nie jestem zaznajomiony z Text i nie mogę zagwarantować, że nie jest to niewłaściwe użycie tych indeksów, jak powiedział @NullUserException.)
Indeksy wielokolumnowe a łączenie indeksów
W sytuacji, którą opisujesz w swojej edycji, zwykle nie byłoby znaczącej różnicy między używaniem indeksu na (A, B) a łączeniem oddzielnych indeksów na A i B. Zbudowałem kilka testów z danymi podobnymi do tych, które opisałeś, a łączenie indeksów wymagało tylko 7 spójnych wyników w porównaniu z 2 spójnymi pobraniami dla indeksu wielokolumnowego.
Powodem tego jest to, że Oracle pobiera dane w blokach. Blok ma zwykle 8 KB, a blok indeksu jest już posortowany, więc prawdopodobnie możesz zmieścić wartości od 500 do 2000 w kilku blokach. Jeśli martwisz się o wydajność, zwykle IO do odczytu i zapisu bloków jest jedyną rzeczą, która ma znaczenie. To, czy Oracle ma połączyć kilka tysięcy wierszy, czy nie, to nieistotna ilość czasu procesora.
Nie dotyczy to jednak indeksów Oracle Text. Możesz połączyć indeks CONTEXT z indeksem btree ("mapa bitowa i"?), ale wydajność jest słaba.