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:
- Chuyển đổi được thực hiện cho mọi hàng, điều này diễn ra chậm;
- 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:
-
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));
-
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 đó.
-
Tạo riêng biệt cột
ID_CHAR
thuộc loạiVARCHAR2
và điền nó bằngTO_CHAR(id)
. Lập chỉ mục nó và sử dụng thay vìID
trongWHERE
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.