2010-06-30 38 views
35

Giả sử rằng category_id là khóa chỉ mục (không phải khóa chính) của bảng books. Có sự khác biệt nào giữa hai câu lệnh SQL sau không?SQL - Thứ tự của điều kiện WHERE có quan trọng không?

SELECT * FROM books WHERE author='Bill' AND category_id=1 

SELECT * FROM books WHERE category_id=1 AND author='Bill' 

Tôi đoán lọc hồ sơ đầu tiên bởi category_id và sau đó bởi author là nhanh hơn so với cách lọc chúng theo thứ tự ngược lại. Các công cụ SQL có đủ thông minh để thực hiện theo cách này không?

+1

Tôi đã tìm kiếm trước khi đăng. Bất kỳ ai cũng biết cách chỉnh sửa bài đăng này để giúp tìm kiếm dễ dàng hơn khi một người khác có cùng câu hỏi sau? – powerboy

+0

@OMG _ Remus Rusanu đã đăng liên kết này lên một câu hỏi khá gần đây. Có lẽ đó là? http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/ –

+0

@Martin Smith: Không biết Remus có một blog, rất hay. Có một liên kết cho nơi liên kết blog đã được đăng? –

Trả lời

32

Không, thứ tự của mệnh đề WHERE không quan trọng.

Trình tối ưu hóa xem xét truy vấn & xác định phương tiện tốt nhất để nhận dữ liệu dựa trên các chỉ mục và như vậy. Ngay cả khi có một chỉ số bao trùm trên cột category_id và tác giả - hoặc sẽ đáp ứng các tiêu chí để sử dụng nó (giả sử không có cái gì tốt hơn).

+0

Mặc dù tôi đồng ý một điều tôi sẽ bổ sung là Tôi sẽ ra lệnh cho logic của bạn sẽ chuyển ngay lập tức khi sử dụng hoặc báo cáo hoặc có thể thất bại ngay lập tức khi sử dụng và báo cáo. Không cần phải kiểm tra các tiêu chí khác nếu bạn có thể tìm ra ngay lập tức. – spinon

+0

Thống kê có thể không cập nhật ảnh hưởng đến điều này? –

+1

@Abe Miessler: Có, thống kê và chỉ mục bị lỗi thời có thể tác động tiêu cực đến những gì trình tối ưu hóa chọn. Nhưng càng có nhiều dữ liệu thì càng tốn kém để giữ cho chúng được cập nhật. –

2

Tóm lại, không, chúng không quan trọng vì trình tối ưu hóa sẽ xác định phương tiện tốt nhất để tìm nạp dữ liệu.

8

SQL là declarative.

Trong ví dụ của bạn, bạn đã nói với động cơ/trình tối ưu hóa những gì bạn muốn ... bây giờ nó sẽ tìm cách tốt nhất để làm điều đó (trong lý do và "chi phí" sẽ không có chủ đề).

+5

+1 cho tuyên bố đúng. Điều đó nói rằng, Prolog là khai báo và chưa (ít nhất là với triển khai tôi đã sử dụng) thứ tự của các điều kiện quan trọng. –

2

Trong khi nói chung, không, giả sử bạn đang sử dụng cơ sở dữ liệu hiện đại. Có lẽ mười năm trước, nó chắc chắn quan trọng sau đó.

+0

Có. Có vẻ như Trình tối ưu hóa dựa trên quy tắc của Oracle (RBO) sẽ xem xét thứ tự các vị từ trong một mệnh đề where khi phát triển một kế hoạch thực hiện. –

+0

+1 để đề xuất rằng các hệ thống RDBMS cũ hơn có thể không có tính năng này. – Nuzzolilo

Các vấn đề liên quan