Hành vi tổng hợp luồng lẻ


11

Truy vấn:

declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';

select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);

Kết quả:

-----------
0
1
NULL
NULL

Kế hoạch thực hiện:

nhập mô tả hình ảnh ở đây

Nhánh trên cùng cắt nhỏ XML thành bốn hàng và nhánh dưới cùng tìm nạp giá trị cho thuộc tính ID.

Điều làm tôi ngạc nhiên là số lượng hàng được trả về từ toán tử Stream Aggregate. 2 hàng xuất phát từ Bộ lọc là IDthuộc tính từ các nút đầu tiên và thứ hai itemtrong XML. Tập hợp luồng trả về bốn hàng, một hàng cho mỗi hàng đầu vào, có hiệu quả biến Kết nối bên trong thành Tham gia ngoài.

Đây có phải là điều mà Stream Aggregate thực hiện trong các trường hợp khác không hay nó chỉ là một điều kỳ quặc xảy ra khi thực hiện các truy vấn XML?

Tôi không thể thấy bất kỳ gợi ý nào trong phiên bản XML của kế hoạch truy vấn rằng Tập hợp luồng này sẽ hoạt động khác với bất kỳ Tập hợp luồng nào khác mà tôi đã nhận thấy trước đây.

Câu trả lời:


13

Tập hợp là tổng hợp vô hướng (không có nhóm theo mệnh đề). Chúng được định nghĩa trong SQL Server để luôn tạo một hàng, ngay cả khi đầu vào trống.

Ví dụ, đối với tổng vô hướng , MAXkhông có hàng nào NULL, COUNTkhông có hàng nào bằng 0, chẳng hạn. Trình tối ưu hóa biết tất cả về điều này và có thể chuyển đổi một phép nối bên ngoài thành một phép nối bên trong trong các trường hợp phù hợp.

-- NULL for a scalar aggregate
SELECT MAX(V.v) FROM (VALUES(1)) AS V (v) WHERE V.v = 2;

-- No row for a vector aggregate
SELECT MAX(V.v) FROM (VALUES(1)) AS V (v) WHERE V.v = 2 GROUP BY ();

Để biết thêm về tập hợp, hãy xem bài viết của tôi Vui với Vô hướng và Tổng hợp Vector .


10

Điều cần nhớ ở đây là các kế hoạch thực hiện hút dữ liệu thông qua.

Vì vậy, toán tử Nested Loop gọi Stream Aggregate 4 lần. Tập hợp Stream cũng gọi Bộ lọc 4 lần, nhưng chỉ nhận được giá trị hai lần.

Vì vậy, Tập hợp luồng cho bốn giá trị. Hai lần nó cho một giá trị, và hai lần nó mang lại cho Null.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.