Teks Oracle
1 - Anda dapat meningkatkan kinerja dengan membuat indeks CONTEXT dengan FILTER BY:
create index my_idx on my_table(text) indextype is ctxsys.context filter by group_id;
Dalam pengujian saya filter by
pasti meningkatkan kinerjanya, tetapi masih sedikit lebih cepat hanya dengan menggunakan indeks btree di group_id.
2 - Indeks CTXCAT menggunakan "sub-indeks", dan tampaknya berfungsi mirip dengan indeks multi-kolom. Ini sepertinya opsi (4) yang Anda cari:
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
Ini mungkin pendekatan tercepat. Menggunakan kueri di atas terhadap 120MB teks acak yang mirip dengan skenario A dan B Anda hanya membutuhkan 18 get yang konsisten. Namun sisi negatifnya, pembuatan indeks CTXCAT membutuhkan waktu hampir 11 menit dan menggunakan ruang 1,8 GB.
(Catatan:Teks Oracle tampaknya berfungsi dengan benar di sini, tetapi saya tidak terbiasa dengan Teks dan saya tidak dapat memastikan bahwa ini bukanlah penggunaan indeks yang tidak tepat seperti yang dikatakan @NullUserException.)
Indeks multi-kolom vs. gabungan indeks
Untuk situasi yang Anda gambarkan dalam suntingan Anda, biasanya tidak akan ada perbedaan yang signifikan antara menggunakan indeks pada (A,B) dan menggabungkan indeks terpisah pada A dan B. Saya membuat beberapa pengujian dengan data yang mirip dengan yang Anda gambarkan dan penggabungan indeks hanya diperlukan 7 perolehan yang konsisten versus 2 perolehan yang konsisten untuk indeks multi-kolom.
Alasan untuk ini adalah karena Oracle mengambil data dalam blok. Sebuah blok biasanya 8K, dan blok indeks sudah diurutkan, jadi Anda mungkin dapat memasukkan nilai 500 hingga 2000 dalam beberapa blok. Jika Anda khawatir tentang kinerja, biasanya IO untuk membaca dan menulis blok adalah satu-satunya hal yang penting. Apakah Oracle harus menggabungkan beberapa ribu baris atau tidak adalah jumlah waktu CPU yang tidak penting.
Namun, ini tidak berlaku untuk indeks Oracle Text. Anda dapat bergabung dengan indeks CONTEXT dengan indeks btree ("bitmap dan"?), tetapi kinerjanya buruk.