Текст на 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 („растрово изображение и“?), но производителността е лоша.