Làm thế nào tôi có thể thoát khỏi một nhánh song song không có ích khi hủy xoay một hàng?


9

Hãy xem xét các truy vấn sau đây hủy bỏ một số ít các tổng hợp vô hướng:

SELECT A, B
FROM (
    SELECT 
      MAX(CASE WHEN ID = 1 THEN 1 ELSE 0 END) VAL1
    , MAX(CASE WHEN ID = 2 THEN 1 ELSE 0 END) VAL2
    , MAX(CASE WHEN ID = 3 THEN 1 ELSE 0 END) VAL3
    , MAX(CASE WHEN ID = 4 THEN 1 ELSE 0 END) VAL4
    , MAX(CASE WHEN ID = 5 THEN 1 ELSE 0 END) VAL5
    , MAX(CASE WHEN ID = 6 THEN 1 ELSE 0 END) VAL6
    , MAX(CASE WHEN ID = 7 THEN 1 ELSE 0 END) VAL7
    , MAX(CASE WHEN ID = 16 THEN 1 ELSE 0 END) VAL16
    FROM dbo.PARALLEL_ZONE_REPRO
) q
UNPIVOT(B FOR A IN (
    VAL1
    ,VAL2
    ,VAL3
    ,VAL4
    ,VAL5
    ,VAL6
    ,VAL7
    ,VAL16
)) U
OPTION (MAXDOP 4);

Trên SQL Server 2017, tôi nhận được một kế hoạch với hai nhánh song song. Nhánh song song bên trái cảm thấy không phù hợp với tôi. Trình tối ưu hóa đảm bảo rằng sẽ chỉ có một đầu ra hàng duy nhất từ ​​tổng hợp vô hướng toàn cầu, nhưng toán tử mẹ của nó là Luồng phân phối với phân vùng vòng tròn:

vòng tròn

Khi tôi thực hiện truy vấn, tất cả các hàng sẽ chuyển đến một chuỗi như mong đợi. Không có vấn đề về hiệu năng với truy vấn này, nhưng truy vấn dự trữ 8 luồng song song với MAXDOP được đặt thành 4. Một lần nữa, tôi cảm thấy rằng điều này không đúng. Cả hai nhánh song song không thể thực thi cùng một lúc. Tôi muốn tránh việc đặt trước luồng công nhân không cần thiết vì tôi đã bật TF 2467 để thay đổi thuật toán lập lịch để xem xét số lượng luồng công nhân trên mỗi trình lập lịch.

Có thể viết lại truy vấn để có chính xác một nhánh song song có chứa quét bảng và tổng hợp cục bộ không? Ví dụ, tôi sẽ ổn với hình dạng chung bên dưới ngoại trừ việc tôi muốn vòng lặp lồng nhau thực thi trong một vùng nối tiếp:

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

Đối với Lý do ứng dụng ™ Tôi đặc biệt thích tránh chia tách truy vấn này thành nhiều phần. Nếu muốn, bạn có thể xem kế hoạch truy vấn thực tế ở đây . Nếu bạn muốn chơi cùng ở nhà, đây là T-SQL để tạo bảng được sử dụng trong truy vấn:

DROP TABLE IF EXISTS dbo.PARALLEL_ZONE_REPRO;

CREATE TABLE dbo.PARALLEL_ZONE_REPRO (
    ID BIGINT,
    FILLER VARCHAR(100)
);

INSERT INTO dbo.PARALLEL_ZONE_REPRO WITH (TABLOCK)
SELECT
  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) % 15
, REPLICATE('Z', 100)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

Câu trả lời:


8

Tôi có thể có được hình dạng kế hoạch mong muốn với phép nối tiếp nối tiếp khi tất cả các điều sau đây là đúng:

  • Một APPLYhoặc CROSS JOINđược sử dụng thay vìUNPIVOT
  • Không APPLYchứa tài liệu tham khảo bên ngoài
  • Nguồn của các hàng trong hàm APPLYlà một hàm tạo giá trị bảng đối lập với bảng

Ví dụ, đây là một cách để làm điều đó:

SELECT A, B
FROM 
(
    SELECT A
    , MAX(
        CASE
            WHEN A = 'VAL1' THEN VAL1 
            WHEN A = 'VAL2' THEN VAL2
            WHEN A = 'VAL3' THEN VAL3
            WHEN A = 'VAL4' THEN VAL4
            WHEN A = 'VAL5' THEN VAL5
            WHEN A = 'VAL6' THEN VAL6
            WHEN A = 'VAL7' THEN VAL7
            WHEN A = 'VAL16' THEN VAL16
            ELSE NULL
        END
    ) B
    FROM (
         SELECT 
           MAX(CASE WHEN ID = 1 THEN 1 ELSE 0 END) VAL1
         , MAX(CASE WHEN ID = 2 THEN 1 ELSE 0 END) VAL2
         , MAX(CASE WHEN ID = 3 THEN 1 ELSE 0 END) VAL3
         , MAX(CASE WHEN ID = 4 THEN 1 ELSE 0 END) VAL4
         , MAX(CASE WHEN ID = 5 THEN 1 ELSE 0 END) VAL5
         , MAX(CASE WHEN ID = 6 THEN 1 ELSE 0 END) VAL6
         , MAX(CASE WHEN ID = 7 THEN 1 ELSE 0 END) VAL7
         , MAX(CASE WHEN ID = 16 THEN 1 ELSE 0 END) VAL16
         FROM dbo.PARALLEL_ZONE_REPRO
    ) q
    CROSS APPLY (
        VALUES ('VAL1'), ('VAL2'), ('VAL3'), ('VAL4'),
        ('VAL5'), ('VAL6'), ('VAL7'), ('VAL16') 
    ) ca (A)
    GROUP BY A
) q
WHERE q.B IS NOT NULL
OPTION (MAXDOP 4);

Tôi có được hình dạng kế hoạch kế hoạch mong muốn như được yêu cầu chỉ với một nhánh song song:

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

Tôi đã thử nhiều thứ khác mà không hiệu quả. Câu trả lời này không thỏa đáng ở chỗ tôi không biết tại sao nó hoạt động và nó có thể không hoạt động trong phiên bản SQL Server trong tương lai, nhưng nó đã giải quyết được vấn đề của tôi.


8

Cả hai nhánh song song không thể thực thi cùng một lúc.

Thực hiện bắt đầu ở cạnh trái của kế hoạch. Nhánh vòng lặp lồng nhau đang chạy (mở, chờ dữ liệu) khi nhánh quét bảng đang chạy. Điều này là không thể tránh khỏi . Cả hai chi nhánh đều hoạt động cùng một lúc, vì vậy SQL Server sẽ dành 2 nhân viên DOP cho kế hoạch này.

Để có giải pháp mạnh mẽ, bạn có thể đặt trục trong hàm có giá trị bảng:

CREATE OR ALTER FUNCTION dbo.PivotPZR()
RETURNS @R table 
(
    VAL1 bigint NOT NULL, VAL2 bigint NOT NULL,
    VAL3 bigint NOT NULL, VAL4 bigint NOT NULL,
    VAL5 bigint NOT NULL, VAL6 bigint NOT NULL,
    VAL7 bigint NOT NULL, VAL16 bigint NOT NULL
)
WITH SCHEMABINDING AS
BEGIN
    DECLARE 
        @Val1 bigint, @Val2 bigint, @Val3 bigint, @Val4 bigint,
        @Val5 bigint, @Val6 bigint, @Val7 bigint, @Val16 bigint;

    -- Can use parallelism
    SELECT
        @Val1 = MAX(CASE WHEN PZR.ID = 1 THEN 1 ELSE 0 END),
        @Val2 = MAX(CASE WHEN PZR.ID = 2 THEN 1 ELSE 0 END),
        @Val3 = MAX(CASE WHEN PZR.ID = 3 THEN 1 ELSE 0 END),
        @Val4 = MAX(CASE WHEN PZR.ID = 4 THEN 1 ELSE 0 END),
        @Val5 = MAX(CASE WHEN PZR.ID = 5 THEN 1 ELSE 0 END),
        @Val6 = MAX(CASE WHEN PZR.ID = 6 THEN 1 ELSE 0 END),
        @Val7 = MAX(CASE WHEN PZR.ID = 7 THEN 1 ELSE 0 END),
        @Val16 = MAX(CASE WHEN PZR.ID = 16 THEN 1 ELSE 0 END)
    FROM dbo.PARALLEL_ZONE_REPRO AS PZR;

    -- Single result row
    INSERT @R
        (VAL1, VAL2, VAL3, VAL4, VAL5, VAL6, VAL7, VAL16)
    VALUES
        (@Val1, @Val2, @Val3, @Val4, @Val5, @Val6, @Val7, @Val16);

    RETURN;
END;

Sau đó viết lại truy vấn dưới dạng:

SELECT
    U.A,
    U.B
FROM dbo.PivotPZR() AS PP
UNPIVOT
(
    B FOR A IN (VAL1, VAL2 ,VAL3 ,VAL4, VAL5 ,VAL6 ,VAL7 ,VAL16)
) AS U;

Hàm sử dụng song song với một nhánh duy nhất như mong muốn:

Kế hoạch chức năng

Kế hoạch thực hiện cấp cao nhất là:

Truy vấn cấp cao nhất

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.