निम्नलिखित प्रश्न पर विचार करें कि स्केलर समुच्चय के कुछ मुट्ठी भर unpivots:
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 सर्वर 2017 पर, मुझे दो समानांतर शाखाओं के साथ एक योजना मिलती है। बाईं समानांतर शाखा मेरे लिए जगह से बाहर महसूस करती है। ऑप्टिमाइज़र की गारंटी है कि ग्लोबल स्केलर एग्रीगेट से केवल एक ही पंक्ति आउटपुट होगा, फिर भी इसका मूल ऑपरेटर राउंड रॉबिन विभाजन के साथ एक वितरित धाराएँ हैं:
जब मैं क्वेरी को निष्पादित करता हूं तो सभी पंक्तियां एक ही धागे पर जाती हैं, जैसा कि अपेक्षित था। इस क्वेरी के साथ कोई प्रदर्शन समस्या नहीं है, लेकिन क्वेरी 8 समानांतर सेट MAXDOP के साथ 4 को संग्रहीत करती है। फिर से, मुझे लगता है कि यह जगह से बाहर है। एक ही समय में दोनों समानांतर शाखाओं को निष्पादित करना असंभव है। मैं अनावश्यक कार्यकर्ता थ्रेड आरक्षण से बचना चाहता हूं क्योंकि मेरे पास TF 2467 सक्षम है जो शेड्यूलिंग एल्गोरिदम को शेड्यूलर के वर्कर थ्रेड की संख्या को देखने के लिए बदलता है।
क्या क्वेरी को फिर से लिखना संभव है, जिसमें एक समानान्तर शाखा है जिसमें टेबल स्कैन और स्थानीय कुल समाहित है? उदाहरण के लिए, मैं नीचे दिए गए सामान्य आकार के साथ ठीक रहूंगा, सिवाय इसके कि मैं नेस्टेड लूप को एक सीरियल ज़ोन में निष्पादित करना चाहता हूं:
एप्लिकेशन कारण ™ के लिए, मैं दृढ़ता से इस क्वेरी को भागों में विभाजित करने से बचना चाहता हूं। यदि वांछित है, तो आप यहां वास्तविक क्वेरी प्लान देख सकते हैं । यदि आप घर पर खेलना चाहते हैं, तो क्वेरी में प्रयुक्त तालिका बनाने के लिए यहां टी-एसक्यूएल है:
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;