Oracle-Text
1 - Sie können die Leistung verbessern, indem Sie den CONTEXT-Index mit FILTER BY:
erstellencreate index my_idx on my_table(text) indextype is ctxsys.context filter by group_id;
In meinen Tests der filter by
definitiv die Leistung verbessert, aber es war immer noch etwas schneller, nur einen btree-Index auf group_id zu verwenden.
2 - CTXCAT-Indizes verwenden "Sub-Indizes" und scheinen ähnlich wie ein mehrspaltiger Index zu funktionieren. Dies scheint die gesuchte Option (4) zu sein:
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
Dies ist wahrscheinlich der schnellste Ansatz. Die Verwendung der obigen Abfrage für 120 MB zufälligen Text, ähnlich wie in Ihrem A- und B-Szenario, erforderte nur 18 konsistente Abrufe. Aber auf der anderen Seite dauerte die Erstellung des CTXCAT-Index fast 11 Minuten und verbrauchte 1,8 GB Speicherplatz.
(Hinweis:Oracle Text scheint hier korrekt zu funktionieren, aber ich bin mit Text nicht vertraut und kann nicht garantieren, dass dies keine unangemessene Verwendung dieser Indizes ist, wie @NullUserException sagte.)
Mehrspaltige Indizes vs. Index-Joins
Für die Situation, die Sie in Ihrer Bearbeitung beschreiben, normalerweise Es gäbe keinen signifikanten Unterschied zwischen der Verwendung eines Indexes für (A, B) und dem Join separater Indizes für A und B. Ich habe einige Tests mit Daten erstellt, die den von Ihnen beschriebenen ähneln, und für einen Indexjoin waren nur 7 konsistente Gets im Vergleich zu 2 konsistenten Gets erforderlich für den mehrspaltigen Index.
Der Grund dafür ist, dass Oracle Daten in Blöcken abruft. Ein Block ist normalerweise 8 KB groß und ein Indexblock ist bereits sortiert, sodass Sie die Werte von 500 bis 2000 wahrscheinlich in ein paar Blöcken unterbringen können. Wenn Sie sich Sorgen um die Leistung machen, ist normalerweise das IO zum Lesen und Schreiben von Blöcken das einzige, was zählt. Ob Oracle ein paar tausend Zeilen zusammenfügen muss oder nicht, ist eine belanglose Menge an CPU-Zeit.
Dies gilt jedoch nicht für Oracle Text-Indizes. Sie können einen CONTEXT-Index mit einem btree-Index verbinden (ein "Bitmap und"?), aber die Leistung ist schlecht.