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