Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle:Tìm kiếm toàn văn với điều kiện

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tải bảng dữ liệu Excel vào cơ sở dữ liệu Oracle

  2. Khi mở một kết nối oracle, đối tượng kết nối là null

  3. Tại sao việc chọn các cột được chỉ định và tất cả đều sai trong Oracle SQL?

  4. ORACLE Sau khi kích hoạt cập nhật:giải quyết lỗi bảng đột biến ORA-04091

  5. Cách gửi một yêu cầu POST với dữ liệu biểu mẫu và các tham số trong PL / SQL