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

Find the identical rows in a matrix

How do I reattach a shelf to the wall when it ripped out of the wall?

Why do games have consumables?

What *exactly* is electrical current, voltage, and resistance?

Mistake in years of experience in resume?

What does "function" actually mean in music?

Magical attacks and overcoming damage resistance

Unknown code in script

Philosophical question on logistic regression: why isn't the optimal threshold value trained?

How do I check if a string is entirely made of the same substring?

Do I need to watch Ant-Man and the Wasp and Captain Marvel before watching Avengers: Endgame?

Why must Chinese maps be obfuscated?

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

Von Neumann Extractor - Which bit is retained?

What makes accurate emulation of old systems a difficult task?

Injection into a proper class and choice without regularity

Which big number is bigger?

Can someone publish a story that happened to you?

Island of Knights, Knaves and Spies

Multiple options vs single option UI

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

Find a stone which is not the lightest one

SFDX - Create Objects with Custom Properties

Retract an already submitted recommendation letter (written for an undergrad student)



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 3 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
            1 hour 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
            1 hour 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
            1 hour 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 3 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
            1 hour 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
            1 hour 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
          1 hour 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
          1 hour 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

          Францішак Багушэвіч Змест Сям'я | Біяграфія | Творчасць | Мова Багушэвіча | Ацэнкі дзейнасці | Цікавыя факты | Спадчына | Выбраная бібліяграфія | Ушанаванне памяці | У філатэліі | Зноскі | Літаратура | Спасылкі | НавігацыяЛяхоўскі У. Рупіўся дзеля Бога і людзей: Жыццёвы шлях Лявона Вітан-Дубейкаўскага // Вольскі і Памідораў з песняй пра немца Адвакат, паэт, народны заступнік Ашмянскі веснікВ Минске появится площадь Богушевича и улица Сырокомли, Белорусская деловая газета, 19 июля 2001 г.Айцец беларускай нацыянальнай ідэі паўстаў у бронзе Сяргей Аляксандравіч Адашкевіч (1918, Мінск). 80-я гады. Бюст «Францішак Багушэвіч».Яўген Мікалаевіч Ціхановіч. «Партрэт Францішка Багушэвіча»Мікола Мікалаевіч Купава. «Партрэт зачынальніка новай беларускай літаратуры Францішка Багушэвіча»Уладзімір Іванавіч Мелехаў. На помніку «Змагарам за родную мову» Барэльеф «Францішак Багушэвіч»Памяць пра Багушэвіча на Віленшчыне Страчаная сталіца. Беларускія шыльды на вуліцах Вільні«Krynica». Ideologia i przywódcy białoruskiego katolicyzmuФранцішак БагушэвічТворы на knihi.comТворы Францішка Багушэвіча на bellib.byСодаль Уладзімір. Францішак Багушэвіч на Лідчыне;Луцкевіч Антон. Жыцьцё і творчасьць Фр. Багушэвіча ў успамінах ягоных сучасьнікаў // Запісы Беларускага Навуковага таварыства. Вільня, 1938. Сшытак 1. С. 16-34.Большая российская1188761710000 0000 5537 633Xn9209310021619551927869394п

          Беларусь Змест Назва Гісторыя Геаграфія Сімволіка Дзяржаўны лад Палітычныя партыі Міжнароднае становішча і знешняя палітыка Адміністрацыйны падзел Насельніцтва Эканоміка Культура і грамадства Сацыяльная сфера Узброеныя сілы Заўвагі Літаратура Спасылкі НавігацыяHGЯOiТоп-2011 г. (па версіі ej.by)Топ-2013 г. (па версіі ej.by)Топ-2016 г. (па версіі ej.by)Топ-2017 г. (па версіі ej.by)Нацыянальны статыстычны камітэт Рэспублікі БеларусьШчыльнасць насельніцтва па краінахhttp://naviny.by/rubrics/society/2011/09/16/ic_articles_116_175144/А. Калечыц, У. Ксяндзоў. Спробы засялення краю неандэртальскім чалавекам.І ў Менску былі мамантыА. Калечыц, У. Ксяндзоў. Старажытны каменны век (палеаліт). Першапачатковае засяленне тэрыторыіГ. Штыхаў. Балты і славяне ў VI—VIII стст.М. Клімаў. Полацкае княства ў IX—XI стст.Г. Штыхаў, В. Ляўко. Палітычная гісторыя Полацкай зямліГ. Штыхаў. Дзяржаўны лад у землях-княствахГ. Штыхаў. Дзяржаўны лад у землях-княствахБеларускія землі ў складзе Вялікага Княства ЛітоўскагаЛюблінская унія 1569 г."The Early Stages of Independence"Zapomniane prawdy25 гадоў таму было аб'яўлена, што Язэп Пілсудскі — беларус (фота)Наша вадаДакументы ЧАЭС: Забруджванне тэрыторыі Беларусі « ЧАЭС Зона адчужэнняСведения о политических партиях, зарегистрированных в Республике Беларусь // Министерство юстиции Республики БеларусьСтатыстычны бюлетэнь „Полаўзроставая структура насельніцтва Рэспублікі Беларусь на 1 студзеня 2012 года і сярэднегадовая колькасць насельніцтва за 2011 год“Индекс человеческого развития Беларуси — не было бы нижеБеларусь занимает первое место в СНГ по индексу развития с учетом гендерного факцёраНацыянальны статыстычны камітэт Рэспублікі БеларусьКанстытуцыя РБ. Артыкул 17Трансфармацыйныя задачы БеларусіВыйсце з крызісу — далейшае рэфармаванне Беларускі рубель — сусветны лідар па дэвальвацыяхПра змену коштаў у кастрычніку 2011 г.Бядней за беларусаў у СНД толькі таджыкіСярэдні заробак у верасні дасягнуў 2,26 мільёна рублёўЭканомікаГаласуем за ТОП-100 беларускай прозыСучасныя беларускія мастакіАрхитектура Беларуси BELARUS.BYА. Каханоўскі. Культура Беларусі ўсярэдзіне XVII—XVIII ст.Анталогія беларускай народнай песні, гуказапісы спеваўБеларускія Музычныя IнструментыБеларускі рок, які мы страцілі. Топ-10 гуртоў«Мясцовы час» — нязгаслая легенда беларускай рок-музыкіСЯРГЕЙ БУДКІН. МЫ НЯ ЗНАЕМ СВАЁЙ МУЗЫКІМ. А. Каладзінскі. НАРОДНЫ ТЭАТРМагнацкія культурныя цэнтрыПублічная дыскусія «Беларуская новая пьеса: без беларускай мовы ці беларуская?»Беларускія драматургі па-ранейшаму лепш ставяцца за мяжой, чым на радзіме«Працэс незалежнага кіно пайшоў, і дзяржаву турбуе яго непадкантрольнасць»Беларускія філосафы ў пошуках прасторыВсе идём в библиотекуАрхіваванаАб Нацыянальнай праграме даследавання і выкарыстання касмічнай прасторы ў мірных мэтах на 2008—2012 гадыУ космас — разам.У суседнім з Барысаўскім раёне пабудуюць Камандна-вымяральны пунктСвяты і абрады беларусаў«Мірныя бульбашы з малой краіны» — 5 непраўдзівых стэрэатыпаў пра БеларусьМ. Раманюк. Беларускае народнае адзеннеУ Беларусі скарачаецца колькасць злачынстваўЛукашэнка незадаволены мінскімі ўладамі Крадзяжы складаюць у Мінску каля 70% злачынстваў Узровень злачыннасці ў Мінскай вобласці — адзін з самых высокіх у краіне Генпракуратура аналізуе стан са злачыннасцю ў Беларусі па каэфіцыенце злачыннасці У Беларусі стабілізавалася крымінагеннае становішча, лічыць генпракурорЗамежнікі сталі здзяйсняць у Беларусі больш злачынстваўМУС Беларусі турбуе рост рэцыдыўнай злачыннасціЯ з ЖЭСа. Дазволіце вас абкрасці! Рэйтынг усіх службаў і падраздзяленняў ГУУС Мінгарвыканкама вырасАб КДБ РБГісторыя Аператыўна-аналітычнага цэнтра РБГісторыя ДКФРТаможняagentura.ruБеларусьBelarus.by — Афіцыйны сайт Рэспублікі БеларусьСайт урада БеларусіRadzima.org — Збор архітэктурных помнікаў, гісторыя Беларусі«Глобус Беларуси»Гербы и флаги БеларусиАсаблівасці каменнага веку на БеларусіА. Калечыц, У. Ксяндзоў. Старажытны каменны век (палеаліт). Першапачатковае засяленне тэрыторыіУ. Ксяндзоў. Сярэдні каменны век (мезаліт). Засяленне краю плямёнамі паляўнічых, рыбакоў і збіральнікаўА. Калечыц, М. Чарняўскі. Плямёны на тэрыторыі Беларусі ў новым каменным веку (неаліце)А. Калечыц, У. Ксяндзоў, М. Чарняўскі. Гаспадарчыя заняткі ў каменным векуЭ. Зайкоўскі. Духоўная культура ў каменным векуАсаблівасці бронзавага веку на БеларусіФарміраванне супольнасцей ранняга перыяду бронзавага векуФотографии БеларусиРоля беларускіх зямель ва ўтварэнні і ўмацаванні ВКЛВ. Фадзеева. З гісторыі развіцця беларускай народнай вышыўкіDMOZGran catalanaБольшая российскаяBritannica (анлайн)Швейцарскі гістарычны15325917611952699xDA123282154079143-90000 0001 2171 2080n9112870100577502ge128882171858027501086026362074122714179пппппп

          ValueError: Expected n_neighbors <= n_samples, but n_samples = 1, n_neighbors = 6 (SMOTE) The 2019 Stack Overflow Developer Survey Results Are InCan SMOTE be applied over sequence of words (sentences)?ValueError when doing validation with random forestsSMOTE and multi class oversamplingLogic behind SMOTE-NC?ValueError: Error when checking target: expected dense_1 to have shape (7,) but got array with shape (1,)SmoteBoost: Should SMOTE be ran individually for each iteration/tree in the boosting?solving multi-class imbalance classification using smote and OSSUsing SMOTE for Synthetic Data generation to improve performance on unbalanced dataproblem of entry format for a simple model in KerasSVM SMOTE fit_resample() function runs forever with no result