2013-04-14 39 views

Trả lời

3

kế hoạch với uẩn cửa sổ thường sử dụng một phụ thường biểu hiện ống chỉ. Một ghi tốt lên thuộc loại này của kế hoạch là ở đây Partitioning and the Common Subexpression Spool

Giả sử bảng có các hàng sau

CREATE TABLE [dbo].[EMP](
    [EMPNO] [int] NOT NULL, 
    [SAL] [int] NULL) 

INSERT INTO [dbo].[EMP] 
VALUES (1,1), 
     (1,2), 
     (1,3), 
     (1,4), 
     (2,1), 
     (2,2) 

Nó có 6 hàng trong tổng số 2 EMPNO giá trị khác biệt. Kế hoạch thực hiện thực tế cho thấy số hàng thực tế được phát ra ở bên dưới.

enter image description here

Các iterator phân đoạn ở đầu của kế hoạch bổ sung thêm một lá cờ để các hàng đi qua nó chỉ khi nó là sự bắt đầu của một phân vùng mới (ví dụ: các empno đã thay đổi).

Ống chỉ về phía trước bên trái của nó (ống chính) nhận một hàng tại một thời điểm từ trình vòng lặp đoạn và chèn nó vào một bảng làm việc trong tempdb. Một khi nó nhận được lá cờ nói rằng một nhóm mới đã bắt đầu, nó trả về một hàng cho đầu vào hàng đầu của toán tử vòng lặp lồng nhau.

Điều này khiến luồng tổng hợp được gọi qua các hàng trong bảng công việc (ống thứ cấp trong kế hoạch), được tính toán sau đó giá trị này được nối lại với các hàng trong bảng công việc (toán tử spool thứ ba trong kế hoạch) trước khi bàn làm việc được cắt ngắn sẵn sàng cho nhóm mới.

Phân khúc ống chính phát ra một hàng giả để có được các nhóm thức xử lý đó là lý do số lượng thực tế của hàng phát ra được hiển thị như 3 (số lượng các nhóm cộng một)

0

chức năng tổng hợp với OVER khoản có thể được viết lại như sau: TỪ bảng AS x INNER JOIN (các cột phân vùng SELECT, AggregateWithoutOverClause (...) ... FROM ...) AS y ON x.PartitionColumns = y.PartitionColumns (nếu các cột phân vùng là bắt buộc - NOT NULL).

Ví dụ:

SET STATISTICS IO ON; 
SET NOCOUNT ON; 

-- OP's query 
SELECT sal,sum(sal) over(PARTITION BY empno) 
FROM emp; 

-- Reqwriten query 
SELECT a.sal, b.SumSal 
FROM emp a 
INNER JOIN (SELECT EMPNO, SUM(sal) AS SumSal FROM emp GROUP BY EMPNO) b ON a.EMPNO = b.EMPNO; 

Kết quả:

sal   
----------- ----------- 
1   10 
2   10 
3   10 
4   10 
1   3 
2   3 

Table 'Worktable'. Scan count 3, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'EMP'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

sal   SumSal 
----------- ----------- 
1   10 
2   10 
3   10 
4   10 
1   3 
2   3 

Table 'Worktable'. Scan count 3, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'EMP'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

kế hoạch Thực hiện: enter image description here

này sẽ giải thích chỉ tham gia cuối cùng: enter image description here

Giải thích cho số lần đầu tiên tham gia có thể được tìm thấy trong phần Xử lý theo nhóm/Partitioning and the Common Subexpression Spool.

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