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

How to have a sharp product image?

Is Electric Central Heating worth it if using Solar Panels?

Mistake in years of experience in resume?

Is Diceware more secure than a long passphrase?

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

Israeli soda type drink

Can a Bard use the Spell Glyph option of the Glyph of Warding spell and cast a known spell into the glyph?

Why do distances seem to matter in the Foundation world?

How do I deal with a coworker that keeps asking to make small superficial changes to a report, and it is seriously triggering my anxiety?

Can someone publish a story that happened to you?

Apply a different color ramp to subset of categorized symbols in QGIS?

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

What is purpose of DB Browser(dbbrowser.aspx) under admin tool?

Multiple fireplaces in an apartment building?

A faster way to compute the largest prime factor

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

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

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

Why do real positive eigenvalues result in an unstable system? What about eigenvalues between 0 and 1? or 1?

Can a stored procedure reference the database in which it is stored?

What is the unit of time_lock_delta in LND?

How can I practically buy stocks?

Co-worker works way more than he should

Find a stone which is not the lightest one



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;








3















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




























    3















    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
























      3












      3








      3








      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 4 hours ago









      Joe ObbishJoe Obbish

      22.3k43493




      22.3k43493




















          1 Answer
          1






          active

          oldest

          votes


















          3














          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 love APPLY versus UNPIVOT, but one would expect the declarative nature of T-SQL to result in the same plan shape for both variants. It'll be interesting to see what happens with this.

            – Max Vernon
            2 hours ago











          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









          3














          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 love APPLY versus UNPIVOT, but one would expect the declarative nature of T-SQL to result in the same plan shape for both variants. It'll be interesting to see what happens with this.

            – Max Vernon
            2 hours ago















          3














          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 love APPLY versus UNPIVOT, but one would expect the declarative nature of T-SQL to result in the same plan shape for both variants. It'll be interesting to see what happens with this.

            – Max Vernon
            2 hours ago













          3












          3








          3







          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 4 hours ago









          Joe ObbishJoe Obbish

          22.3k43493




          22.3k43493












          • I love APPLY versus UNPIVOT, but one would expect the declarative nature of T-SQL to result in the same plan shape for both variants. It'll be interesting to see what happens with this.

            – Max Vernon
            2 hours ago

















          • I love APPLY versus UNPIVOT, but one would expect the declarative nature of T-SQL to result in the same plan shape for both variants. It'll be interesting to see what happens with this.

            – Max Vernon
            2 hours ago
















          I love APPLY versus UNPIVOT, but one would expect the declarative nature of T-SQL to result in the same plan shape for both variants. It'll be interesting to see what happens with this.

          – Max Vernon
          2 hours ago





          I love APPLY versus UNPIVOT, but one would expect the declarative nature of T-SQL to result in the same plan shape for both variants. It'll be interesting to see what happens with this.

          – Max Vernon
          2 hours ago

















          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

          How to create a command for the “strange m” symbol in latex? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)How do you make your own symbol when Detexify fails?Writing bold small caps with mathpazo packageplus-minus symbol with parenthesis around the minus signGreek character in Beamer document titleHow to create dashed right arrow over symbol?Currency symbol: Turkish LiraDouble prec as a single symbol?Plus Sign Too Big; How to Call adfbullet?Is there a TeX macro for three-legged pi?How do I get my integral-like symbol to align like the integral?How to selectively substitute a letter with another symbol representing the same letterHow do I generate a less than symbol and vertical bar that are the same height?

          Българска екзархия Съдържание История | Български екзарси | Вижте също | Външни препратки | Литература | Бележки | НавигацияУстав за управлението на българската екзархия. Цариград, 1870Слово на Ловешкия митрополит Иларион при откриването на Българския народен събор в Цариград на 23. II. 1870 г.Българската правда и гръцката кривда. От С. М. (= Софийски Мелетий). Цариград, 1872Предстоятели на Българската екзархияПодмененият ВеликденИнформационна агенция „Фокус“Димитър Ризов. Българите в техните исторически, етнографически и политически граници (Атлас съдържащ 40 карти). Berlin, Königliche Hoflithographie, Hof-Buch- und -Steindruckerei Wilhelm Greve, 1917Report of the International Commission to Inquire into the Causes and Conduct of the Balkan Wars

          Чепеларе Съдържание География | История | Население | Спортни и природни забележителности | Културни и исторически обекти | Религии | Обществени институции | Известни личности | Редовни събития | Галерия | Източници | Литература | Външни препратки | Навигация41°43′23.99″ с. ш. 24°41′09.99″ и. д. / 41.723333° с. ш. 24.686111° и. д.*ЧепелареЧепеларски Linux fest 2002Начало на Зимен сезон 2005/06Национални хайдушки празници „Капитан Петко Войвода“Град ЧепелареЧепеларе – народният ски курортbgrod.orgwww.terranatura.hit.bgСправка за населението на гр. Исперих, общ. Исперих, обл. РазградМузей на родопския карстМузей на спорта и скитеЧепеларебългарскибългарскианглийскитукИстория на градаСки писти в ЧепелареВремето в ЧепелареРадио и телевизия в ЧепелареЧепеларе мами с родопски чар и добри пистиЕвтин туризъм и снежни атракции в ЧепелареМестоположениеИнформация и снимки от музея на родопския карст3D панорами от ЧепелареЧепелареррр