2013-07-01 33 views
21

tôi có dưới đây SQL Query,là gì tự thực hiện cho câu lệnh SQL này

SELECT TOP 5 C.CustomerID,C.CustomerName,C.CustomerSalary 
FROM Customer C 
WHERE C.CustomerSalary > 10000 
ORDER BY C.CustomerSalary DESC 

sẽ là gì để thực hiện những điều sau đây với lời giải thích hợp lý,

  1. TOP khoản
  2. Ở ĐÂU Khoản
  3. ĐẶT HÀNG theo khoản
+8

Có vẻ như một câu hỏi thi ... –

+0

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

+0

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? –

Trả lời

51

Check-out the documentation for the SELECT statement, đặc biệt là phần này:

logic xử lý theo thứ tự của câu lệnh SELECT

Các bước sau đây hiển thị thứ tự xử lý hợp lý, hoặc ràng buộc thứ tự, đối với câu lệnh SELECT. Thứ tự này xác định khi nào các đối tượng được xác định trong một bước sẽ được cung cấp cho các mệnh đề trong các bước tiếp theo. Ví dụ: nếu bộ xử lý truy vấn có thể liên kết với (truy cập) các bảng hoặc các khung nhìn được xác định trong mệnh đề FROM, các đối tượng này và các cột của chúng được cung cấp cho tất cả các bước tiếp theo. Ngược lại, vì mệnh đề SELECT là bước 8, bất kỳ bí danh cột nào hoặc có nguồn gốc cột được xác định trong điều khoản đó không thể được tham chiếu theo các mệnh đề trước . Tuy nhiên, chúng có thể được tham chiếu bởi các mệnh đề tiếp theo, chẳng hạn như mệnh đề ORDER BY. Lưu ý rằng việc thực thi vật lý thực tế của câu lệnh được xác định bởi bộ xử lý truy vấn và thứ tự có thể thay đổi từ danh sách này.

mang đến cho thứ tự sau đây:

FROM 
ON 
JOIN 
WHERE 
GROUP BY 
WITH CUBE or WITH ROLLUP 
HAVING 
SELECT 
DISTINCT 
ORDER BY 
TOP 
+13

+1 Bạn nên nhấn mạnh * * rằng việc thực thi vật lý thực tế của câu lệnh được xác định bởi bộ xử lý truy vấn và thứ tự có thể thay đổi từ danh sách này **. Trong thực tế, tôi mong đợi thứ tự rất có thể là 'TOP',' ORDER BY', 'WHERE' nhưng lưu ý rằng mỗi bước phụ thuộc vào bước kế tiếp, trong khi' TOP' sẽ ** bắt đầu ** trước 'ORDER BY' sẽ ** bắt đầu ** trước 'WHERE', trong thực tế' WHERE' sẽ ** kết thúc ** trước 'ORDER BY' sẽ ** kết thúc ** trước' TOP'. Đọc kế hoạch thực hiện: nó đi từ trái sang phải. –

+3

Có vẻ như bạn đã thực hiện nó cho tôi :-) –

+0

Không thể nằm trong danh sách này. Nó được sử dụng trong mệnh đề 'FROM' nhưng nó không tự đứng vững. –

10

Đây là chính xác để thực hiện, với trường hợp của bạn.

1-FROM 
2-WHERE 
3-SELECT 
4-ORDER BY 
5-TOP 
+0

là thứ tự thực hiện chung này cho tất cả SQL/RDBMS? Tôi biết mọi RDBMS có tối ưu hóa riêng của nó hay không, nhưng chúng ta có thể ít nhất phụ thuộc vào thứ tự logic này khi thực hiện các hàng có sẵn không? – mmcrae

1

$ 0,02 của tôi tại đây.

Có hai khái niệm khác nhau đang hoạt động ở đây: thứ tự thực hiện lôgic và kế hoạch thực hiện truy vấn. Một cách khác là xem ai là người trả lời các câu hỏi sau:

  1. Làm thế nào MSSQL hiểu truy vấn SQL của tôi?
  2. Điều gì sẽ làm để thực thi theo cách tốt nhất có thể được với giản đồ và dữ liệu hiện tại?

Câu hỏi đầu tiên được trả lời theo thứ tự thực hiện hợp lý. Brian's answer hiển thị nó là gì.Đó là cách SQL hiểu lệnh của bạn: "FROM bảng khách hàng (bí danh là C) chỉ xem xét các hàng WHERE C.CustomerSalary> 10000, ORDER chúng BY C.CustomerSalary theo thứ tự mong muốn và SELECT các cột được liệt kê cho TOP 5 hàng". Kết quả sẽ tuân theo ý nghĩa

Câu hỏi thứ hai là kế hoạch thực hiện truy vấn - và nó phụ thuộc vào lược đồ của bạn (bảng định nghĩa, chọn lọc dữ liệu, số lượng hàng trong bảng khách hàng, chỉ mục đã xác định, v.v.) phụ thuộc vào tối ưu hóa SQL Server hoạt động nội bộ.

6

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):

enter image description here

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):

enter image description here

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ế!

2

Truy cập https://msdn.microsoft.com/en-us/library/ms189499.aspx để có giải thích tốt hơn.

Các bước sau hiển thị thứ tự xử lý lôgic hoặc thứ tự ràng buộc cho câu lệnh SELECT. Thứ tự này xác định khi các đối tượng được xác định trong một bước được tạo sẵn cho các mệnh đề trong các bước tiếp theo. Ví dụ, nếu bộ xử lý truy vấn có thể liên kết với (truy cập) các bảng hoặc khung nhìn được định nghĩa trong mệnh đề FROM, các đối tượng này và các cột của chúng được tạo sẵn cho tất cả các bước tiếp theo. Ngược lại, vì mệnh đề SELECT là bước 8, bất kỳ bí danh cột hoặc cột có nguồn gốc nào được xác định trong mệnh đề đó không thể được tham chiếu bởi các mệnh đề trước đó. Tuy nhiên, chúng có thể được tham chiếu bởi các mệnh đề tiếp theo như mệnh đề ORDER BY. Lưu ý rằng việc thực thi vật lý thực tế của câu lệnh được xác định bởi bộ xử lý truy vấn và thứ tự có thể thay đổi từ danh sách này.

TỪ

ON

THAM GIA

ĐÂU

GROUP BY

VỚI CUBE hoặc VỚI ROLLUP

CHỌN

DISTINCT

ORDER BY

TOP

5

Đơn giản chỉ cần nhớ cụm từ này: - Grave Weird Fred Jones' Có vài Owls Xỉn

Lấy chữ cái đầu tiên của mỗi từ, và bạn có được điều này: -

FROM 
(ON) 
JOIN 
WHERE 
GROUP BY 
(WITH CUBE or WITH ROLLUP) 
HAVING 
SELECT 
DISTINCT 
ORDER BY 
TOP 

Hy vọng rằng sẽ giúp.

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