Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle:Пълнотекстово търсене с условие

Текст на Oracle

1 – Можете да подобрите производителността, като създадете индекса CONTEXT с FILTER BY:

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

В моите тестове filter by определено подобри производителността, но все пак беше малко по-бързо просто да се използва btree индекс на group_id.

2 - CTXCAT индексите използват "подиндекси" и изглежда работят подобно на индекс с много колони. Изглежда, че това е опцията (4), която търсите:

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

Това вероятно е най-бързият подход. Използването на горната заявка срещу 120MB произволен текст, подобен на вашия сценарий A и B, изисква само 18 последователни получаване. Но от друга страна, създаването на индекса CTXCAT отне почти 11 минути и използва 1,8 GB пространство.

(Забележка:Oracle Text изглежда работи правилно тук, но не съм запознат с Text и не мога да гарантирам, че това не е неподходящо използване на тези индекси, както каза @NullUserException.)

Индекси с няколко колони срещу присъединяване на индекс

За ситуацията, която описвате в редакцията си, обикновено няма да има значителна разлика между използването на индекс за (A,B) и присъединяването на отделни индекси за A и B. Изградих някои тестове с данни, подобни на описаните от вас, и присъединяването към индекс изисква само 7 последователни получаване срещу 2 последователни gets за индекса с няколко колони.

Причината за това е, че Oracle извлича данни в блокове. Един блок обикновено е 8K, а индексният блок вече е сортиран, така че вероятно можете да съберете стойностите от 500 до 2000 в няколко блока. Ако се притеснявате за производителността, обикновено IO за четене и запис на блокове е единственото нещо, което има значение. Дали Oracle трябва да обедини няколко хиляди реда или не, е незначително време на процесора.

Това обаче не се отнася за индексите на Oracle Text. Можете да се присъедините към индекс CONTEXT с индекс на btree („растрово изображение и“?), но производителността е лоша.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. текстово търсене на Oracle blob

  2. Как да използвам PBKDF2 в Oracle 12c?

  3. Основна таблица за одит на тригерите на Oracle

  4. Динамично завъртане на таблица Oracle

  5. Проблем със създаването на чужд ключ в Oracle