TOP, WHERE và ORDER BY không được "thực thi" - chúng chỉ mô tả kết quả mong muốn và trình tối ưu hóa truy vấn cơ sở dữ liệu xác định (hy vọng) kế hoạch tốt nhất cho việc thực thi thực tế. Sự tách biệt giữa "tuyên bố kết quả mong muốn" và cách nó được thể chất đạt được là điều làm cho SQL trở thành một ngôn ngữ "khai báo".
Giả sử có một chỉ mục trên CustomerSalary
, và bàn là không nhóm, câu hỏi của bạn có thể sẽ được thực hiện như một chỉ mục tìm kiếm + truy cập bảng heap, như minh họa trong SQL Fiddle này (click vào Xem Kế hoạch thực hiện tại phía dưới):
Như bạn có thể thấy, đầu tiên chính xác giá trị CustomerSalary
được tìm thấy qua các Index Seek, sau đó hàng mà giá trị thuộc về được lấy từ bảng heap thông qua RID Lookup (Tra cứu ID hàng). Đầu trang chỉ dành cho hiển thị ở đây (và có 0% chi phí), như là Vòng lặp lồng nhau cho vấn đề đó - chỉ mục bắt đầu tìm kiếm sẽ trả về (tối đa) một hàng trong mọi trường hợp. Toàn bộ truy vấn khá hiệu quả và có khả năng sẽ chỉ tốn một vài hoạt động I/O.
Nếu bảng là clustered, bạn có thể sẽ có chỉ số khác tìm kiếm thay vì truy cập bảng heap, như minh họa trong SQL Fiddle này (lưu ý việc thiếu từ khóa nonclustered trong SQL DDL):
Nhưng hãy cẩn thận: Tôi đã may mắn lần này để có được kế hoạch thực hiện "đúng". Trình tối ưu hóa truy vấn có thể đã chọn quét toàn bộ bảng, đôi khi thực sự nhanh hơn trên các bảng nhỏ. Khi phân tích các kế hoạch truy vấn, luôn cố gắng thực hiện điều đó trên các lượng dữ liệu thực tế!
Nguồn
2013-07-03 20:17:10
Có vẻ như một câu hỏi thi ... –
Không chính xác, tôi đã tìm thấy rất nhiều quan điểm khác nhau của mọi người về vấn đề này. Chỉ muốn xác nhận. :) – Manoj
Bạn có hỏi về thứ tự thực hiện hợp lý hay thứ tự thực tế/vật lý thực hiện không? –