JohnH đã bao phủ rất tốt phần về cách viết các truy vấn. Tuy nhiên, có một vấn đề quan trọng khác phải được đề cập, đó là các đặc tính hiệu suất của một truy vấn như vậy. Hãy lặp lại nó ở đây (thích nghi với Oracle):
SELECT EmployeeName FROM EmployeeTable WHERE LENGTH(EmployeeName) > 4;
truy vấn này được hạn chế kết quả của một hàm áp dụng cho một giá trị cột (kết quả của việc áp dụng LENGTH
chức năng để cột EmployeeName
). Trong Oracle, và có lẽ trong tất cả các RDBMS khác, điều này có nghĩa là một chỉ mục thường xuyên trên EmployeeName sẽ vô dụng để trả lời truy vấn này; cơ sở dữ liệu sẽ thực hiện quét toàn bộ bảng, có thể thực sự tốn kém.
Tuy nhiên, các cơ sở dữ liệu khác nhau cung cấp chỉ mục chức năng tính năng được thiết kế để tăng tốc các truy vấn như thế này. Ví dụ: trong Oracle, bạn có thể tạo một chỉ mục như thế này:
CREATE INDEX EmployeeTable_EmployeeName_Length ON EmployeeTable(LENGTH(EmployeeName));
Điều này có thể vẫn không giúp ích cho trường hợp của bạn, vì chỉ mục có thể không rất chọn lọc cho điều kiện của bạn. Bởi điều này tôi có nghĩa là sau đây: bạn đang yêu cầu cho các hàng có chiều dài của tên là hơn 4. Hãy giả định rằng 80% tên nhân viên trong bảng đó dài hơn 4.Vâng, sau đó cơ sở dữ liệu có khả năng sẽ kết luận (chính xác) rằng nó không có giá trị sử dụng chỉ mục, bởi vì nó có lẽ sẽ phải đọc hầu hết các khối trong bảng anyway.
Tuy nhiên, nếu bạn thay đổi truy vấn để nói LENGTH(EmployeeName) <= 4
hoặc LENGTH(EmployeeName) > 35
, giả sử rằng rất ít nhân viên có tên có ít hơn 5 ký tự hoặc hơn 35 ký tự, thì chỉ mục sẽ được chọn và cải thiện hiệu suất.
Dù sao, trong ngắn hạn: hãy cẩn thận về đặc điểm hiệu suất của các truy vấn giống như truy vấn bạn đang cố viết.
Nguồn
2011-12-14 19:13:04
Đây có phải là máy chủ sql không? – JonH