sql >> Databasteknik >  >> RDS >> Oracle

Oracle:Fulltextsökning med villkor

Oracle Text

1 - Du kan förbättra prestandan genom att skapa CONTEXT-indexet med FILTER BY:

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

I mina tester filter by förbättrade definitivt prestandan, men det var fortfarande något snabbare att bara använda ett btree-index på group_id.

2 - CTXCAT-index använder "underindex" och verkar fungera på samma sätt som ett index med flera kolumner. Det här verkar vara alternativet (4) du letar 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

Detta är förmodligen det snabbaste tillvägagångssättet. Att använda ovanstående fråga mot 120 MB slumpmässig text som liknar ditt A- och B-scenario krävde bara 18 konsekventa gets. Men på nackdelen tog det nästan 11 minuter att skapa CTXCAT-indexet och använde 1,8 GB utrymme.

(Obs:Oracle Text verkar fungera korrekt här, men jag är inte bekant med Text och jag kan inte garantera att detta inte är en olämplig användning av dessa index som @NullUserException sa.)

Index med flera kolumner kontra indexkopplingar

För situationen du beskriver i din redigering, normalt det skulle inte vara någon signifikant skillnad mellan att använda ett index på (A,B) och att sammanfoga separata index på A och B. Jag byggde några tester med data liknande det du beskrev och en indexkoppling krävde endast 7 konsekventa gets mot 2 konsekventa gets för indexet med flera kolumner.

Anledningen till detta är att Oracle hämtar data i block. Ett block är vanligtvis 8K och ett indexblock är redan sorterat, så du kan förmodligen passa 500 till 2000 värden i några block. Om du är orolig för prestanda är vanligtvis IO för att läsa och skriva block det enda som betyder något. Huruvida Oracle måste sammanfoga några tusen rader eller inte är en obetydlig mängd CPU-tid.

Detta gäller dock inte Oracle Text-index. Du kan ansluta ett CONTEXT-index med ett btree-index (en "bitmapp och"?), men prestandan är dålig.



  1. En översikt över Amazon RDS &Aurora-erbjudanden för PostgreSQL

  2. Hur man importerar en Heroku PG-dump till lokal maskin

  3. Om pglogisk prestanda

  4. Hur man tar bort ledande och efterföljande blanksteg i SQL Server – TRIM()