2010-07-17 8 views
9

Trong cuốn sách Bên trong Microsoft SQL Server ™ 2005 T-SQL Truy vấn, tác giả Itzik Ben-Gan cho chúng tôi thứ tự hoặc SQL server xử lý truy vấn logic năm 2005 là:Confused về logic để xử lý truy vấn Itzik Ben-Gan trong mình SQL Server 2005 cuốn sách và SQL Server 2008 cuốn sách

(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list> 
(1) FROM <left_table> 
(3)  <join_type> JOIN <right_table> 
(2)  ON <join_condition> 
(4) WHERE <where_condition> 
(5) GROUP BY <group_by_list> 
(6) WITH {CUBE | ROLLUP} 
(7) HAVING <having_condition> 
(10) ORDER BY <order_by_list> 

1. FROM 
2. ON 
3. OUTER (join) 
4. WHERE 
5. GROUP BY 
6. CUBE | ROLLUP 
7. HAVING 
8. SELECT 
9. DISTINCT 
10. ORDER BY <---------------------- NOTE 
11. TOP  <---------------------- NOTE 

Trong cuốn sách của ông Bên trong Microsoft SQL server 2008: T-SQL truy vấn, ông cho chúng tôi biết logic để xử lý truy vấn sau đây:

(1) FROM 
(1-J1) Cartesian Product 
(1-J2) ON Filter 
(1-J3) Add Outer Rows 
(2) WHERE 
(3) GROUP BY 
(4) HAVING 
(5) SELECT 
(5-1) Evaluate Expressions 
(5-2) DISTINCT 
(5-3) TOP  <---------------------- NOTE 
(6) ORDER BY <---------------------- NOTE 

Lưu ý thứ tự của TOPORDER BY trong trích đoạn trên từ những cuốn sách này. Họ chỉ là đối diện. Tôi nghĩ rằng hai bước này là rất quan trọng, và sẽ đưa ra một kết quả hoàn toàn khác với thứ tự khác nhau. Tôi muốn biết liệu SQL Server 2008 đã thay đổi một cái gì đó trong đó là công cụ lưu trữ từ SQL Server 2005 hoặc một cái gì đó khác gây ra điều này?

Cảm ơn.

Trả lời

6

Thứ tự xử lý lôgic cũng được ghi lại trong mục nhập Books Online này. Hãy cẩn thận để phân biệt lôgic đơn đặt hàng xử lý từ đơn đặt hàng xử lý thực tế. Như các ghi chú vào BOL:

Các bước sau đây hiển thị thứ tự xử lý logic, hoặc ràng buộc trật tự, đối với một 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.

Các truy vấn tối ưu là miễn phí để dịch các yêu cầu hợp lý theo quy định của truy vấn vào bất kỳ vật lý kế hoạch thực hiện sản xuất các kết quả chính xác. Nói chung, có nhiều lựa chọn thay thế vật lý cho một truy vấn logic nhất định, vì vậy nó là khá bình thường đối với một kế hoạch vật lý khác biệt cơ bản từ thứ tự xử lý logic (cho mục đích ràng buộc) được mô tả ở trên.

5

Kiểm tra this out - đó là sự cố về vấn đề này - và sách Itzik được đề cập. Thứ tự thứ hai ở trên là chính xác.

+2

Lưu ý rằng TOP sử dụng ORDER BY trong việc xác định các hàng cần giữ. Đây là mô hình xử lý logic - vì vậy việc nhận được các bản ghi TOP n dựa trên ORDER BY _logically_ không dẫn đến một rowset với một thứ tự cụ thể - bước lôgic ORDER BY yêu cầu kết quả. Về mặt xử lý vật lý, ORDER BY sẽ được thực hiện trước TOP n. –

3

Trong phiên bản 2015 của mình T-SQL Querying, Itzik Ben-Gan cập nhật xử lý truy vấn logic trong "LISTING 1-1 số bước truy vấn-chế biến logic" như thế này:

(5) SELECT (5-2) DISTINCT (7) TOP(<top_specification>) (5-1) <select_list> 
(1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate> 
     | (1-A) <left_table> <apply_type> APPLY <right_input_table> AS <alias> 
     | (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias> 
     | (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias> 
(2) WHERE <where_predicate> 
(3) GROUP BY <group_by_specification> 
(4) HAVING <having_predicate> 
(6) ORDER BY <order_by_list> 
(7) OFFSET <offset_specification> ROWS FETCH NEXT <fetch_specification> ROWS ONLY; 

Không giống như các phiên bản trước năm 2008 của cuốn sách, ORDER BY (bước 6) hiện đang xảy ra trước TOP (bước 7). Tất nhiên, như đã nói ở nơi khác, cả hai đều có liên quan. Như Itzik giải thích trên trang 6 của T-SQL Querying:

[TOP] lọc số quy định của hàng dựa trên đặt hàng trong mệnh đề ORDER BY, hoặc dựa trên thứ tự tùy ý nếu một mệnh đề ORDER BY là vắng mặt. Với OFFSET-FETCH, pha này bỏ qua số hàng được chỉ định và sau đó lọc số được chỉ định tiếp theo của các hàng, dựa trên thứ tự trong mệnh đề ORDER BY.

Hiểu các bước xử lý truy vấn hợp lý ở trên rất quan trọng vì nó giải thích các quirks không trực quan khác trong SQL.

Ví dụ, bạn không thể sử dụng một bí danh từ SELECT khoản (bước 5-2) trong WHERE khoản (bước 2) vì động cơ biểu hiện đánh giá các khoản WHERE trước mệnh đề SELECT.

-- This won't work! 
SELECT Cost = Quantity * Price 
FROM Orders 
WHERE Cost > 500.00; 

Như Itzik nói trong cuốn sách của ông, "Các giai đoạn trong xử lý logic của một truy vấn có thứ tự cụ thể. Ngược lại, tôi ưu hoa thường có thể tạo lối tắt trong kế hoạch thực hiện vật lý mà nó tạo ra. Trong số Tất nhiên, nó sẽ tạo ra các phím tắt chỉ khi kết quả thiết lập được đảm bảo là đúng. "