Văn bản Oracle
1 - Bạn có thể cải thiện hiệu suất bằng cách tạo chỉ mục CONTEXT với FILTER BY:
create index my_idx on my_table(text) indextype is ctxsys.context filter by group_id;
Trong các thử nghiệm của tôi, bộ lọc filter by
chắc chắn đã cải thiện hiệu suất, nhưng vẫn nhanh hơn một chút nếu chỉ sử dụng chỉ mục btree trên group_id.
2 - Chỉ mục CTXCAT sử dụng "chỉ mục phụ" và dường như hoạt động tương tự như chỉ mục nhiều cột. Đây có vẻ là tùy chọn (4) bạn đang tìm kiếm:
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
Đây có thể là cách tiếp cận nhanh nhất. Sử dụng truy vấn trên với 120MB văn bản ngẫu nhiên tương tự như kịch bản A và B của bạn, chỉ cần 18 nhất quán được. Nhưng mặt trái của nó, việc tạo chỉ mục CTXCAT mất gần 11 phút và sử dụng 1,8GB dung lượng.
(Lưu ý:Văn bản Oracle dường như hoạt động chính xác ở đây, nhưng tôi không quen thuộc với Văn bản và tôi không thể hiểu đây không phải là cách sử dụng không phù hợp các chỉ mục này như @NullUserException đã nói.)
Chỉ mục nhiều cột so với kết hợp chỉ mục
Đối với tình huống bạn mô tả trong bản chỉnh sửa của mình, bình thường sẽ không có sự khác biệt đáng kể giữa việc sử dụng chỉ mục trên (A, B) và kết hợp các chỉ mục riêng biệt trên A và B. Tôi đã xây dựng một số thử nghiệm với dữ liệu tương tự như những gì bạn mô tả và chỉ cần tham gia chỉ mục 7 nhất quán được so với 2 nhất quán được cho chỉ mục nhiều cột.
Lý do cho điều này là vì Oracle truy xuất dữ liệu theo khối. Một khối thường là 8K và một khối chỉ mục đã được sắp xếp, vì vậy bạn có thể có thể vừa với 500 đến 2000 giá trị trong một vài khối. Nếu bạn lo lắng về hiệu suất, thông thường các khối IO để đọc và ghi là điều duy nhất quan trọng. Việc Oracle có liên kết với nhau vài nghìn hàng hay không là một lượng thời gian CPU không quan trọng.
Tuy nhiên, điều này không áp dụng cho các chỉ mục Văn bản của Oracle. Bạn có thể kết hợp chỉ mục CONTEXT với chỉ mục btree ("bitmap và"?), Nhưng hiệu suất kém.