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

Truy vấn Oracle sử dụng 'like' trên cột số được lập chỉ mục, hiệu suất kém

LIKE điều kiện khớp mẫu mong đợi để xem các loại ký tự là cả toán hạng bên trái và bên phải. Khi nó gặp một NUMBER, nó sẽ chuyển đổi nó thành char một cách hoàn toàn. Truy vấn 1 của bạn về cơ bản được viết lại một cách thầm lặng như sau:

SELECT a1.*
  FROM people a1
 WHERE TO_CHAR(a1.id) LIKE '119%'
   AND ROWNUM < 5

Điều đó xảy ra trong trường hợp của bạn và điều đó không tốt vì 2 lý do:

  1. Chuyển đổi được thực hiện cho mọi hàng, điều này diễn ra chậm;
  2. Do một hàm (mặc dù ẩn) trong một vị từ WHERE, Oracle không thể sử dụng chỉ mục trên A1.ID cột.

Để vượt qua nó, bạn cần thực hiện một trong những điều sau:

  1. Tạo chỉ mục dựa trên chức năng trên A1.ID cột:

    CREATE INDEX people_idx5 ON people (TO_CHAR(id));

  2. Nếu bạn cần khớp các bản ghi trên 3 ký tự đầu tiên của cột ID, hãy tạo một cột khác thuộc loại NUMBER chỉ chứa 3 ký tự này và sử dụng = đơn giản toán tử trên đó.

  3. Tạo riêng biệt cột ID_CHAR thuộc loại VARCHAR2 và điền nó bằng TO_CHAR(id) . Lập chỉ mục nó và sử dụng thay vì ID trong WHERE của bạn điều kiện.

    Tất nhiên nếu bạn chọn tạo một cột bổ sung dựa trên cột ID hiện có, bạn cần phải giữ cho 2 cột đó được đồng bộ hóa. CHÈN và CẬP NHẬT các câu lệnh trong mã của bạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mã hóa / giải mã Oracle

  2. Cách định dạng số bằng dấu trừ / dấu cộng trong Oracle

  3. Làm thế nào để lập trình tên bảng trong PL / SQL?

  4. ORA-01830:hình ảnh định dạng ngày kết thúc trước khi chuyển đổi toàn bộ chuỗi đầu vào / Chọn tổng trong đó truy vấn ngày

  5. thiết kế cơ sở dữ liệu cho cài đặt thông báo