ลองพิจารณาคำถามต่อไปนี้ที่ไม่ได้รวมจำนวนสเกลาร์จำนวนไม่กี่ตัว:
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);
ใน SQL Server 2017 ฉันได้รับแผนสองสาขาขนาน สาขาคู่ขนานด้านซ้ายให้ความรู้สึกไม่ตรงกับฉัน เครื่องมือเพิ่มประสิทธิภาพมีการรับประกันว่าจะมีเพียงเอาต์พุตแถวเดียวจากการรวมสเกลาร์โกลบอล แต่ตัวดำเนินการหลักของมันคือ Distribute Streams ที่มีการแบ่งพาร์ติชันแบบโรบิน:
เมื่อฉันเรียกใช้แบบสอบถามแถวทั้งหมดไปยังเธรดเดียวตามที่คาดไว้ ไม่มีปัญหาประสิทธิภาพการทำงานกับแบบสอบถามนี้ แต่แบบสอบถามสำรอง 8 กระทู้ขนานกับ MAXDOP ตั้งค่าเป็น 4 อีกครั้งฉันรู้สึกว่านี่เป็นสถานที่ มันเป็นไปไม่ได้ที่กิ่งก้านสาขาทั้งคู่จะดำเนินการในเวลาเดียวกัน ฉันต้องการหลีกเลี่ยงการจองเธรดผู้ปฏิบัติงานที่ไม่จำเป็นเนื่องจากฉันเปิดใช้งาน TF 2467 ซึ่งเปลี่ยนอัลกอริทึมการจัดตารางเวลาเพื่อดูจำนวนเธรดผู้ปฏิบัติงานต่อตัวกำหนดตารางเวลา
เป็นไปได้ไหมที่จะเขียนแบบสอบถามใหม่เพื่อให้มีสาขาแบบขนานหนึ่งสาขาที่มีการสแกนตารางและการรวมภายในเครื่อง ตัวอย่างเช่นฉันจะสบายกับรูปร่างทั่วไปด้านล่างยกเว้นว่าฉันต้องการวนซ้อนกันเพื่อดำเนินการในโซนอนุกรม:
สำหรับ Application Reasons ™ฉันต้องการหลีกเลี่ยงการแยกแบบสอบถามนี้ออกเป็นส่วน ๆ หากต้องการคุณสามารถดูแผนแบบสอบถามที่เกิดขึ้นจริงที่นี่ หากคุณต้องการเล่นที่บ้านนี่คือ T-SQL เพื่อสร้างตารางที่ใช้ในการสืบค้น:
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;