How can I get rid of an unhelpful parallel branch when unpivoting a single row?NUMA Nodes - MAXDOP - PLESQL Server thread statuswhy sql server has high Worker threads?SQL Server Threads and Degree Of ParallelismIs it possible to see which SPID uses which scheduler (worker thread)?Who is using my worker threads? SQL Server 2014 - HADRMeasure Agent Job failure and running jobs with 'execution_status'SQL Server instance running out of worker threadsWhat's the easiest and most accurate way to visualize parallel thread usage in SQL Server?MAX worker thread in SQL server 2012/14/16

"My boss was furious with me and I have been fired" vs. "My boss was furious with me and I was fired"

"The cow" OR "a cow" OR "cows" in this context

What is the best way to deal with NPC-NPC combat?

Older movie/show about humans on derelict alien warship which refuels by passing through a star

Why did C use the -> operator instead of reusing the . operator?

Combinatorics problem, right solution?

Are there moral objections to a life motivated purely by money? How to sway a person from this lifestyle?

Drawing a german abacus as in the books of Adam Ries

Israeli soda type drink

How can I practically buy stocks?

What is the most expensive material in the world that could be used to create Pun-Pun's lute?

A faster way to compute the largest prime factor

std::unique_ptr of base class holding reference of derived class does not show warning in gcc compiler while naked pointer shows it. Why?

Critique of timeline aesthetic

Is there a word for the censored part of a video?

Does a large simulator bay have standard public address announcements?

What is /etc/mtab in Linux?

Where was the County of Thurn und Taxis located?

Extracting Dirichlet series coefficients

Rudin 2.10 (b) Example

How long after the last departure shall the airport stay open for an emergency return?

Negative Resistance

As an international instructor, should I openly talk about my accent?

How bug prioritization works in agile projects vs non agile



How can I get rid of an unhelpful parallel branch when unpivoting a single row?


NUMA Nodes - MAXDOP - PLESQL Server thread statuswhy sql server has high Worker threads?SQL Server Threads and Degree Of ParallelismIs it possible to see which SPID uses which scheduler (worker thread)?Who is using my worker threads? SQL Server 2014 - HADRMeasure Agent Job failure and running jobs with 'execution_status'SQL Server instance running out of worker threadsWhat's the easiest and most accurate way to visualize parallel thread usage in SQL Server?MAX worker thread in SQL server 2012/14/16






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








6















Consider the following query that unpivots a few handfuls of scalar aggregates:



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);


On SQL Server 2017, I get a plan with two parallel branches. The left parallel branch feels out of place to me. The optimizer has a guarantee that there will be only a single row output from the global scalar aggregate, yet the parent operator of it is a Distribute Streams with round robin partitioning:



round robin



When I execute the query all of the rows go to a single thread as expected. There's no performance problem with this query, but the query reserves 8 parallel threads with MAXDOP set to 4. Again, I feel that this is out of place. It's impossible for both parallel branches to execute at the same time. I want to avoid unnecessary worker thread reservation because I have TF 2467 enabled which changes the scheduling algorithm to look at the number of worker threads per scheduler.



Is it possible to rewrite the query to have exactly one parallel branch that contains the table scan and local aggregate? For example, I would be fine with the general shape below except that I want the nested loop to execute in a serial zone:



enter image description here



For Application Reasons™ I strongly prefer to avoid splitting this query up into parts. If desired, you can view the actual query plan here. If you'd like to play along at home, here is T-SQL to create the table used in the query:



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;









share|improve this question




























    6















    Consider the following query that unpivots a few handfuls of scalar aggregates:



    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);


    On SQL Server 2017, I get a plan with two parallel branches. The left parallel branch feels out of place to me. The optimizer has a guarantee that there will be only a single row output from the global scalar aggregate, yet the parent operator of it is a Distribute Streams with round robin partitioning:



    round robin



    When I execute the query all of the rows go to a single thread as expected. There's no performance problem with this query, but the query reserves 8 parallel threads with MAXDOP set to 4. Again, I feel that this is out of place. It's impossible for both parallel branches to execute at the same time. I want to avoid unnecessary worker thread reservation because I have TF 2467 enabled which changes the scheduling algorithm to look at the number of worker threads per scheduler.



    Is it possible to rewrite the query to have exactly one parallel branch that contains the table scan and local aggregate? For example, I would be fine with the general shape below except that I want the nested loop to execute in a serial zone:



    enter image description here



    For Application Reasons™ I strongly prefer to avoid splitting this query up into parts. If desired, you can view the actual query plan here. If you'd like to play along at home, here is T-SQL to create the table used in the query:



    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;









    share|improve this question
























      6












      6








      6


      1






      Consider the following query that unpivots a few handfuls of scalar aggregates:



      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);


      On SQL Server 2017, I get a plan with two parallel branches. The left parallel branch feels out of place to me. The optimizer has a guarantee that there will be only a single row output from the global scalar aggregate, yet the parent operator of it is a Distribute Streams with round robin partitioning:



      round robin



      When I execute the query all of the rows go to a single thread as expected. There's no performance problem with this query, but the query reserves 8 parallel threads with MAXDOP set to 4. Again, I feel that this is out of place. It's impossible for both parallel branches to execute at the same time. I want to avoid unnecessary worker thread reservation because I have TF 2467 enabled which changes the scheduling algorithm to look at the number of worker threads per scheduler.



      Is it possible to rewrite the query to have exactly one parallel branch that contains the table scan and local aggregate? For example, I would be fine with the general shape below except that I want the nested loop to execute in a serial zone:



      enter image description here



      For Application Reasons™ I strongly prefer to avoid splitting this query up into parts. If desired, you can view the actual query plan here. If you'd like to play along at home, here is T-SQL to create the table used in the query:



      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;









      share|improve this question














      Consider the following query that unpivots a few handfuls of scalar aggregates:



      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);


      On SQL Server 2017, I get a plan with two parallel branches. The left parallel branch feels out of place to me. The optimizer has a guarantee that there will be only a single row output from the global scalar aggregate, yet the parent operator of it is a Distribute Streams with round robin partitioning:



      round robin



      When I execute the query all of the rows go to a single thread as expected. There's no performance problem with this query, but the query reserves 8 parallel threads with MAXDOP set to 4. Again, I feel that this is out of place. It's impossible for both parallel branches to execute at the same time. I want to avoid unnecessary worker thread reservation because I have TF 2467 enabled which changes the scheduling algorithm to look at the number of worker threads per scheduler.



      Is it possible to rewrite the query to have exactly one parallel branch that contains the table scan and local aggregate? For example, I would be fine with the general shape below except that I want the nested loop to execute in a serial zone:



      enter image description here



      For Application Reasons™ I strongly prefer to avoid splitting this query up into parts. If desired, you can view the actual query plan here. If you'd like to play along at home, here is T-SQL to create the table used in the query:



      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;






      sql-server sql-server-2017






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 6 hours ago









      Joe ObbishJoe Obbish

      22.3k43493




      22.3k43493




















          1 Answer
          1






          active

          oldest

          votes


















          6














          I am able to get the desired plan shape with a serial loop join when all of the following are true:



          • An APPLY or CROSS JOIN is used instead of UNPIVOT

          • The APPLY contains no outer references

          • The source of rows in the APPLY is a table value constructor as opposed to a table

          For example, here is one way to do it:



          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);


          I get the desired plan plan shape as claimed with just one parallel branch:



          enter image description here



          I tried many other things that did not work. This answer is unsatisfactory in that I don't know why it works and it may not work in a future version of SQL Server, but it did solve my problem.






          share|improve this answer























            Your Answer








            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "182"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f236732%2fhow-can-i-get-rid-of-an-unhelpful-parallel-branch-when-unpivoting-a-single-row%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            6














            I am able to get the desired plan shape with a serial loop join when all of the following are true:



            • An APPLY or CROSS JOIN is used instead of UNPIVOT

            • The APPLY contains no outer references

            • The source of rows in the APPLY is a table value constructor as opposed to a table

            For example, here is one way to do it:



            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);


            I get the desired plan plan shape as claimed with just one parallel branch:



            enter image description here



            I tried many other things that did not work. This answer is unsatisfactory in that I don't know why it works and it may not work in a future version of SQL Server, but it did solve my problem.






            share|improve this answer



























              6














              I am able to get the desired plan shape with a serial loop join when all of the following are true:



              • An APPLY or CROSS JOIN is used instead of UNPIVOT

              • The APPLY contains no outer references

              • The source of rows in the APPLY is a table value constructor as opposed to a table

              For example, here is one way to do it:



              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);


              I get the desired plan plan shape as claimed with just one parallel branch:



              enter image description here



              I tried many other things that did not work. This answer is unsatisfactory in that I don't know why it works and it may not work in a future version of SQL Server, but it did solve my problem.






              share|improve this answer

























                6












                6








                6







                I am able to get the desired plan shape with a serial loop join when all of the following are true:



                • An APPLY or CROSS JOIN is used instead of UNPIVOT

                • The APPLY contains no outer references

                • The source of rows in the APPLY is a table value constructor as opposed to a table

                For example, here is one way to do it:



                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);


                I get the desired plan plan shape as claimed with just one parallel branch:



                enter image description here



                I tried many other things that did not work. This answer is unsatisfactory in that I don't know why it works and it may not work in a future version of SQL Server, but it did solve my problem.






                share|improve this answer













                I am able to get the desired plan shape with a serial loop join when all of the following are true:



                • An APPLY or CROSS JOIN is used instead of UNPIVOT

                • The APPLY contains no outer references

                • The source of rows in the APPLY is a table value constructor as opposed to a table

                For example, here is one way to do it:



                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);


                I get the desired plan plan shape as claimed with just one parallel branch:



                enter image description here



                I tried many other things that did not work. This answer is unsatisfactory in that I don't know why it works and it may not work in a future version of SQL Server, but it did solve my problem.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered 6 hours ago









                Joe ObbishJoe Obbish

                22.3k43493




                22.3k43493



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Database Administrators Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f236732%2fhow-can-i-get-rid-of-an-unhelpful-parallel-branch-when-unpivoting-a-single-row%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Nidaros erkebispedøme

                    Birsay

                    Where did Arya get these scars? Unicorn Meta Zoo #1: Why another podcast? Announcing the arrival of Valued Associate #679: Cesar Manara Favourite questions and answers from the 1st quarter of 2019Why did Arya refuse to end it?Has the pronunciation of Arya Stark's name changed?Has Arya forgiven people?Why did Arya Stark lose her vision?Why can Arya still use the faces?Has the Narrow Sea become narrower?Does Arya Stark know how to make poisons outside of the House of Black and White?Why did Nymeria leave Arya?Why did Arya not kill the Lannister soldiers she encountered in the Riverlands?What is the current canonical age of Sansa, Bran and Arya Stark?