SELECT first_name, last_name, date_of_birth
FROM employees
WHERE date_of_birth >= TO_DATE(?, 'YYYY-MM-DD')
AND date_of_birth <= TO_DATE(?, 'YYYY-MM-DD')
nhìn ví dụ trên ta thấy, index chỉ scan trong 1 khoảng nhất định
Nếu chúng ta thêm 1 điều kiện where nữa, ví dụ như sau:
SELECT first_name, last_name, date_of_birth
FROM employees
WHERE date_of_birth >= TO_DATE(?, 'YYYY-MM-DD')
AND date_of_birth <= TO_DATE(?, 'YYYY-MM-DD')
AND subsidiary_id = ?
khi đó thì index range scan sẽ ko còn rõ ràng nữa.
Tất nhiên 1 index lý tưởng sẽ đánh trên cả 2 cột này, nhưng câu hỏi đặt ra là, đánh theo thứ tự như nào? cột nào trước - cột nào sau?+ case 1: date_of_birth trước, subsidiary_id sau + case 2: subsidiary_id trước, date_of_birth sau -> Để tăng hiệu năng thì nên đánh thứ tự index như sau: index for equality first—then for ranges.
Tuy nhiên, nếu range của "date_of_birth" ko lớn thì sự khác biệt về hiệu năng giữa 2 case trên cũng ko đáng kể.
2. Indexing SQL LIKE Filters - cần lưu ý khi sd toán tử LIKE vì nó rất a/h đến hiệu năng.
- tiền tố trước % càng nhiều thì hiệu năng càng cao
-> chú ý: chỉ những ký tự đứng trước % thì mới serves as an access predicate, ký tự đằng sau % ko có ý nghĩa -> Tip: nên tránh dùng like with leading wildcards (e.g., '%TERM'). - các database hẩu như giả thuyết là ko có case leading wildcard ở trên
nhưng nếu full text search thì nên làm xáo trộn như sau:
WHERE text_column LIKE '%' || ? || '%'
-> để tránh sql injectionchú ý: Đối với cơ sở dữ liệu PostgreSQL, vấn đề lại khác vì PostgreSQL giả sử có một thẻ đại diện đứng đầu khi sử dụng các tham số liên kết cho một biểu thức LIKE
-> với oracle bạn có thể sd: contains thay vì LIKE
??? hãy nghĩ xem làm sao để đánh index trong case này: '%TERM'???
3. Index Combine (Index Merge) Câu hỏi phổ biến: với mệnh đề where, tạo cho mỗi column 1 index hay 1 index cho nhiều column, cái nào hiệu quả hơn?
trong hầu hết trường hợp thì câu trả lời là: một index với nhiều column thì tốt hơn
Tuy nhiên với câu query sau thì ngược lại:
SELECT first_name, last_name, date_of_birth
FROM employees
WHERE UPPER(last_name) < ?
AND date_of_birth < ?
-> One index scan is faster than two.


0 nhận xét:
Đăng nhận xét