sql >> Database teknologi >  >> RDS >> Oracle

Oracle:Fuldtekstsøgning med betingelse

Oracle-tekst

1 - Du kan forbedre ydeevnen ved at oprette CONTEXT-indekset med FILTER BY:

create index my_idx on my_table(text) indextype is ctxsys.context filter by group_id;

I mine tests filter by definitivt forbedret ydeevnen, men det var stadig lidt hurtigere bare at bruge et btree-indeks på group_id.

2 - CTXCAT-indekser bruger "underindekser" og ser ud til at virke på samme måde som et indeks med flere kolonner. Dette ser ud til at være den mulighed (4), du leder efter:

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

Dette er sandsynligvis den hurtigste tilgang. Brug af ovenstående forespørgsel mod 120 MB tilfældig tekst svarende til dit A- og B-scenarie krævede kun 18 konsekvente gets. Men på minussiden tog oprettelsen af ​​CTXCAT-indekset næsten 11 minutter og brugte 1,8 GB plads.

(Bemærk:Oracle Text ser ud til at fungere korrekt her, men jeg er ikke bekendt med tekst, og jeg kan ikke garantere, at dette ikke er en upassende brug af disse indekser, som @NullUserException sagde.)

Indekser med flere kolonner vs. indeksforbindelser

For den situation, du beskriver i din redigering, normalt der ville ikke være en signifikant forskel mellem at bruge et indeks på (A,B) og at forbinde separate indekser på A og B. Jeg byggede nogle tests med data svarende til det du beskrev, og en indekssammenføjning krævede kun 7 konsistente gets versus 2 konsistente gets for indekset med flere kolonner.

Grunden til dette er, at Oracle henter data i blokke. En blok er normalt 8K, og en indeksblok er allerede sorteret, så du kan sikkert passe 500 til 2000 værdierne i et par blokke. Hvis du er bekymret for ydeevnen, er IO normalt til at læse og skrive blokke det eneste, der betyder noget. Hvorvidt Oracle skal sammenføje et par tusinde rækker eller ej, er en ubetydelig mængde CPU-tid.

Dette gælder dog ikke for Oracle Text-indekser. Du kan tilslutte et CONTEXT-indeks med et btree-indeks (et "bitmap og"?), men ydeevnen er dårlig.



  1. Sådan fungerer SQLite Length()

  2. Aggreger funktion over et givet tidsinterval

  3. JPA - EclipseLink - Sådan ændres standardskema

  4. Sammenligning af datalagre for PostgreSQL - MVCC vs InnoDB