UNPIVOT (একটি লুপ যোগ) দিয়ে ব্যাচ মোডের ব্যবহার কীভাবে করবেন?


12

আমার কাছে নিম্নলিখিত ফর্মটির একটি প্রশ্ন রয়েছে:

SELECT ...
FROM ColumnstoreTable cs
CROSS APPLY (
    SELECT *
    FROM (VALUES
        ('A', cs.DataA)
        , ('B', cs.DataB)
        , ('C', cs.DataC)
    ) x(Col0, Col1)
) someValues

এটি কলামস্টোর-ব্যাকড সাবকোয়ারি ( ColumnstoreTable) থেকে প্রতিটি সারি নেয় এবং এই সারিগুলিকে বহুগুণ করে। এটি মূলত একটি UNPIVOT। আসল প্রশ্নটি এর চেয়ে বড় larger ক্যোয়ারির এই অংশটি অন্য প্রসেসিংয়ে ফিড করে।

এখানে সমস্যা হ'ল এটি CROSS APPLYলুপ জোড় হিসাবে কার্যকর করা হয় যা যুক্তিসঙ্গত পছন্দ। দুর্ভাগ্যক্রমে, লুপ যোগ দেয় ব্যাচ মোড সমর্থন করে না।

ক্যোয়ারীর এই অংশটি খুব কার্য সম্পাদন সমালোচনামূলক এবং আমার সন্দেহ যে এটি ব্যাচ মোডে চালানো পারফরম্যান্সের পক্ষে খুব উপকারী হতে পারে।

আমি কীভাবে এই ক্যোয়ারীটি আবার লিখতে পারি যাতে আমি ব্যাচ মোড থেকে সরে না যেতে পারি?

আমি পরিবর্তে একটি অস্থায়ী টেবিল ব্যবহার করার চেষ্টা করেছি VALUES, তবে এটি হ্যাশ যোগদানের জন্য সমতাতে যোগদানের শর্ত নেই বলে সত্য পরিবর্তন হয় নি।

উত্তর:


12

একটি পদ্ধতির মানগুলির জন্য # টেম্প টেবিল ব্যবহার করা এবং হ্যাশ যোগদানের অনুমতি দেওয়ার জন্য একটি ডমি ইকুইজয়াইন কলাম প্রবর্তন করা যেতে পারে। উদাহরণ স্বরূপ:

-- Create a #temp table with a dummy column to match the hash join
-- and the actual column you want
CREATE TABLE #values (dummy INT NOT NULL, Col0 CHAR(1) NOT NULL)
INSERT INTO #values (dummy, Col0)
VALUES (0, 'A'),
        (0, 'B'),
        (0, 'C')
GO

-- A similar query, but with a dummy equijoin condition to allow for a hash join
SELECT v.Col0, 
    CASE v.Col0 
        WHEN 'A' THEN cs.DataA 
        WHEN 'B' THEN cs.DataB 
        WHEN 'C' THEN cs.DataC
        END AS Col1
FROM ColumnstoreTable cs
JOIN #values v
    -- Join your dummy column to any numeric column on the columnstore,
    -- multiplying that column by 0 to ensure a match to all #values
    ON v.dummy = cs.DataA * 0

পারফরম্যান্স এবং কোয়েরি পরিকল্পনা

এই পদ্ধতির নীচের মত একটি ক্যোয়ারী পরিকল্পনা আসে, এবং হ্যাশ ম্যাচ ব্যাচ মোডে সঞ্চালিত হয়:

এখানে চিত্র বর্ণনা লিখুন

যদি আমি প্রতিস্থাপন SELECTএকটি সঙ্গে বিবৃতি SUMএর CASEকনসোলে ঐ সমস্ত সারি স্ট্রিম এবং তারপর একটি বাস্তব 100mm সারি columnstore টেবিল আমি প্রায় মিথ্যা উপর ক্যোয়ারী চালানোর থাকার এড়াতে অনুক্রমে বিবৃতি আমি দেখতে মোটামুটি ভাল কর্মক্ষমতা প্রয়োজনীয় 300mm জেনারেট করতে সারি:

CPU time = 33803 ms, elapsed time = 4363 ms.

এবং আসল পরিকল্পনা হ্যাশ যোগদানের ভাল সমান্তরালতা দেখায়।

এখানে চিত্র বর্ণনা লিখুন

হ্যাশ সম্পর্কিত নোটগুলি সমান্তরালে যোগ দেয় যখন সমস্ত সারিতে একই মান থাকে

এই ক্যোয়ারীর কার্য সম্পাদন সম্পূর্ণ হ্যাশ টেবিলটিতে প্রবেশের সাথে যুক্ত হওয়ার তদন্তের প্রতিটি থ্রেডের উপর নির্ভর করে (একটি হ্যাশ পার্টিশনযুক্ত সংস্করণের বিপরীতে, যা কেবলমাত্র একটি পৃথক মান রয়েছে বলে প্রদত্ত একক থ্রেডে সমস্ত সারি ম্যাপ করবে) জন্য dummyকলাম)।

ভাগ্যক্রমে, এই ক্ষেত্রে এটি সত্য (যেমন আমরা Parallelismতদন্তের পক্ষের অপারেটরের অভাব দ্বারা দেখতে পাচ্ছি ) এবং নির্ভরযোগ্যভাবে সত্য হওয়া উচিত কারণ ব্যাচ মোড একক হ্যাশ টেবিল তৈরি করে যা থ্রেড জুড়ে ভাগ করা হয়। অতএব, প্রতিটি থ্রেড তাদের সারিগুলি নিতে Columnstore Index Scanএবং সেগুলি ভাগ করে নেওয়া হ্যাশ টেবিলের সাথে মিলিয়ে নিতে পারে। এসকিউএল সার্ভার ২০১২-তে, এই কার্যকারিতাটি খুব কম অনুমানযোগ্য ছিল কারণ একটি স্পিলের ফলে অপারেটরকে রো মোডে পুনরায় চালু করতে হয়েছিল, উভয় ব্যাচের মোডের সুবিধা হারাতে এবং জোড়ের Repartition Streamsতদন্তের পাশের একটি অপারেটরেরও প্রয়োজন হয় যা এই ক্ষেত্রে থ্রেড স্কু তৈরি করে would । স্পিচগুলি ব্যাচ মোডে থেকে যাওয়ার অনুমতি দেওয়া এসকিউএল সার্ভার 2014-এ একটি বড় উন্নতি।

আমার জানা মতে, সারি মোডে এই ভাগ করা হ্যাশ টেবিলের ক্ষমতা নেই। যাইহোক, কিছু ক্ষেত্রে, সাধারণত বিল্ড সাইডের 100 টিরও কম সারি অনুমান সহ, এসকিউএল সার্ভার প্রতিটি থ্রেডের জন্য হ্যাশ টেবিলের একটি পৃথক অনুলিপি তৈরি করবে ( Distribute Streamsহ্যাশ সংযুক্তির শীর্ষস্থানীয় দ্বারা সনাক্তযোগ্য )। এটি খুব শক্তিশালী হতে পারে তবে এটি ব্যাচ মোডের তুলনায় অনেক কম নির্ভরযোগ্য কারণ এটি আপনার কার্ডিনালিটির অনুমানের উপর নির্ভর করে এবং এসকিউএল সার্ভার প্রতিটি থ্রেডের জন্য হ্যাশ টেবিলের একটি সম্পূর্ণ অনুলিপি তৈরির ব্যতীত সুবিধাগুলি মূল্যায়নের চেষ্টা করছে।

ইউনিয়ন সব: একটি সহজ বিকল্প

পল হোয়াইট উল্লেখ করেছিলেন যে UNION ALLপ্রতিটি মানের জন্য সারি একত্রিত করার জন্য আরেকটি এবং সম্ভাব্য সহজতর বিকল্প হতে হবে । এটি সম্ভবত আপনার সেরা বাজি ধরে নেওয়া যায় যে আপনার পক্ষে এই এসকিউএল গতিশীলভাবে তৈরি করা সহজ। উদাহরণ স্বরূপ:

SELECT 'A' AS Col0, c.DataA AS Col1
FROM ColumnstoreTable c
UNION ALL
SELECT 'B' AS Col0, c.DataB AS Col1
FROM ColumnstoreTable c
UNION ALL
SELECT 'C' AS Col0, c.DataC AS Col1
FROM ColumnstoreTable c

এটি এমন একটি পরিকল্পনাও দেয় যা ব্যাচ মোডটি ব্যবহার করতে সক্ষম এবং মূল উত্তরের চেয়ে আরও ভাল পারফরম্যান্স সরবরাহ করে। (যদিও উভয় ক্ষেত্রেই কর্মক্ষমতা যথেষ্ট দ্রুত যে কোনো নির্বাচন বা টেবিল থেকে ডাটা লেখার দ্রুত bottlneck হয়ে যায়।) UNION ALLপদ্ধতির এছাড়াও 0. দ্বারা গুন মত গেম খেলে এড়াতে কখনও কখনও এটি সহজ মনে সেরা!

CPU time = 8673 ms, elapsed time = 4270 ms.

এখানে চিত্র বর্ণনা লিখুন


ইউনিয়ন সমস্ত কৌশল জানতে ভাল, কিন্তু উত্স কোয়েরিটি কেবল একটি টেবিল নয় বরং নিজেই একটি ব্যয়বহুল প্রশ্ন রয়েছে।
বুট লাইফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.