Không , không có tài liệu nào từ Microsoft đảm bảo hành vi, do đó nó không được bảo đảm .
Ngoài ra, giả sử rằng bài viết Cuộc nói chuyện đơn giản là chính xác và toán tử vật lý Kết nối luôn xử lý các đầu vào theo thứ tự được hiển thị trong kế hoạch (rất có thể là đúng), sau đó không đảm bảo rằng SQL Server sẽ luôn tạo các kế hoạch giữ nguyên thứ tự giữa văn bản truy vấn và kế hoạch truy vấn, bạn chỉ khá hơn một chút.
Chúng tôi có thể điều tra điều này hơn nữa mặc dù. Nếu trình tối ưu hóa truy vấn có thể sắp xếp lại đầu vào toán tử Ghép, sẽ tồn tại các hàng trong DMV không có giấy tờ, sys.dm_exec_query_transformation_stats
tương ứng với tối ưu hóa đó.
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
Trên SQL Server 2012 Enterprise Edition, điều này tạo ra 24 hàng. Bỏ qua các kết quả khớp sai cho các phép biến đổi liên quan đến hằng số, có một phép biến đổi liên quan đến Toán tử vật lý nối UNIAtoCON
(Liên kết tất cả với phép nối). Vì vậy, ở cấp độ toán tử vật lý, có vẻ như một khi toán tử ghép được chọn, nó sẽ được xử lý theo thứ tự của toán tử Union All logic mà nó được lấy từ đó.
Trong thực tế điều đó không hoàn toàn đúng. Viết lại tối ưu hóa sau có thể sắp xếp lại các đầu vào thành toán tử Ghép vật lý sau khi tối ưu hóa dựa trên chi phí đã hoàn thành. Một ví dụ xảy ra khi Ghép nối phải tuân theo mục tiêu hàng (vì vậy có thể cần đọc từ đầu vào rẻ hơn trước). Xem UNION ALL
Tối ưu hóa của Paul White để biết thêm chi tiết.
Việc viết lại vật lý muộn này có chức năng lên đến và bao gồm cả SQL Server 2008 R2, nhưng hồi quy có nghĩa là nó không còn được áp dụng cho SQL Server 2012 trở lên. Một bản sửa lỗi đã được ban hành để khôi phục việc viết lại này cho SQL Server 2014 trở lên (không phải 2012) với các hotfix tối ưu hóa truy vấn được bật (ví dụ: cờ theo dõi 4199).
Nhưng về toán tử Liên minh logic Tất cả ( UNIA
)? Có một sự UNIAReorderInputs
chuyển đổi, có thể sắp xếp lại các đầu vào. Ngoài ra còn có hai toán tử vật lý có thể được sử dụng để triển khai Liên minh hợp lý UNIAtoCON
và UNIAtoMERGE
(Liên minh tất cả để hợp nhất).
Do đó, trình tối ưu hóa truy vấn có thể sắp xếp lại các đầu vào cho a UNION ALL
; tuy nhiên, nó dường như không phải là một biến đổi phổ biến (không sử dụng UNIAReorderInputs
trên Máy chủ SQL mà tôi có thể truy cập được. Chúng tôi không biết các trường hợp sẽ sử dụng trình tối ưu hóa UNIAReorderInputs
; mặc dù nó chắc chắn được sử dụng khi hướng dẫn hoặc sử dụng kế hoạch gợi ý kế hoạch được sử dụng để buộc một kế hoạch được tạo bằng cách sử dụng các mục nhập được sắp xếp lại theo thứ tự vật lý được đề cập ở trên.
Có cách nào để động cơ xử lý nhiều hơn một đầu vào cùng một lúc không?
Toán tử vật lý liên kết có thể tồn tại trong một phần song song của kế hoạch. Với một số khó khăn, tôi đã có thể tạo ra một kế hoạch với các kết nối song song bằng cách sử dụng truy vấn sau:
SELECT userid, regdate FROM ( --Users table is around 3mil rows
SELECT userid, RegDate FROM users WHERE userid > 1000000
UNION
SELECT userid, RegDate FROM users WHERE userid < 1000000
UNION all
SELECT userid, RegDate FROM users WHERE userid < 2000000
) d ORDER BY RegDate OPTION (RECOMPILE)
Vì vậy, theo nghĩa chặt chẽ nhất, toán tử Ghép nối vật lý dường như luôn luôn xử lý các đầu vào theo một cách nhất quán (đầu tiên đầu tiên, thứ hai dưới cùng); tuy nhiên, trình tối ưu hóa có thể chuyển đổi thứ tự của các đầu vào trước khi chọn toán tử vật lý hoặc sử dụng liên kết Hợp nhất thay vì Ghép nối.