নিম্নলিখিত কোয়েরিতে বিবেচনা করুন যা কয়েকটি মুষ্টিমেয় স্কেলারের সমষ্টিগুলিকে আনপিবট করে:
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);
এসকিউএল সার্ভারে, আমি দুটি সমান্তরাল শাখা নিয়ে একটি পরিকল্পনা পেয়েছি। বাম সমান্তরাল শাখা আমার কাছে জায়গা থেকে দূরে অনুভব করে। অপ্টিমাইজারটির গ্যারান্টি রয়েছে যে বিশ্বব্যাপী স্কেলার সমষ্টি থেকে কেবল একটি একক সারি আউটপুট থাকবে, তবুও এর প্যারেন্ট অপারেটরটি গোলাকার রবিন বিভাজন সহ একটি বিতরণ স্ট্রিম:
যখন আমি কোয়েরিটি সম্পাদন করি তখন প্রত্যাশার মতো সমস্ত সারি একক থ্রেডে যায়। এই কোয়েরিতে কোনও পারফরম্যান্স সমস্যা নেই, তবে ক্যোয়ারিতে ম্যাক্সডুপের সাথে 8 টি সমান্তরাল থ্রেড সংরক্ষিত রয়েছে Again আবার, আমি অনুভব করি যে এটির জায়গাটি বাইরে। সমান্তরাল উভয় শাখার পক্ষে একই সময়ে কার্যকর করা অসম্ভব। আমি অপ্রয়োজনীয় শ্রমিকের থ্রেড সংরক্ষণগুলি এড়াতে চাই কারণ আমার টিএফ 2467 সক্ষম হয়েছে যা শিডিয়ুলার প্রতি কর্মী থ্রেডের সংখ্যা দেখতে শিডিয়ুলিং অ্যালগরিদম পরিবর্তন করে।
টেবিল স্ক্যান এবং স্থানীয় সমষ্টি সহ ঠিক একটি সমান্তরাল শাখা থাকা কি ক্যোরিয়াকে পুনরায় লেখা সম্ভব? উদাহরণস্বরূপ, নীচের সাধারণ আকারের সাথে আমি ভাল থাকব তবে আমি নীস্টযুক্ত লুপটি ক্রমিক জোনে চালিত করতে চাই:
অ্যাপ্লিকেশন কারণগুলির জন্য - আমি দৃ 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;