এসকিউএল সার্ভার ২০১২-তে দুটি বড় রেজাল্ট সেটের তুলনা করার সবচেয়ে কার্যকরী উপায় কী


9

দুটি বৃহত ফলাফল / সারি সেটকে তুলনা করার সবচেয়ে কার্যকরী উপায়ের জন্য বর্তমান পরামর্শটি EXCEPTঅপারেটরটি ব্যবহার করে বলে মনে হচ্ছে । নীচে থাকা এই স্ব-র অন্তর্ভুক্ত এসকিউএল স্ক্রিপ্টটি সারি মাপের বৃদ্ধি (@ সর্বশেষ মানগুলি পরিবর্তন করুন) হিসাবে খুব অকার্যকর হয়ে পড়ে। আমি একটি সম্মিলিত টেবিলে অনন্য এন্ট্রিগুলি সন্ধান করার চেষ্টা করেছি তবে কোনও উন্নতি হয়নি।

DECLARE @first AS INT, @step AS INT, @last AS INT; 

-- This script is comparing two record sets using EXCEPT
-- I want to find additions from OLD to NEW
-- As number of rows increase performance gets terrible
-- I don't have to use two tables. I could use one combined table but I want the same result as quickly as possible

-- Compare 100 to 110 rows - 0 seconds
-- Compare 1000 to 1010 rows - 1 seconds
-- Compare 10000 to 10010 rows - 16 seconds
-- Compare 100000 to 100010 rows - ABORT after 8 minutes (tables are populated in 18 seconds)

DECLARE @temptableOLD TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100000
WHILE(@first <= @last) BEGIN INSERT INTO @temptableOLD VALUES(@first) SET @first += @step END

DECLARE @temptableNEW TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100010
WHILE(@first <= @last) BEGIN INSERT INTO @temptableNEW VALUES(@first) SET @first += @step END

select * from @temptableNEW
except
select * from @temptableOLD

উত্তর:


8

EXCEPTএকটি DISTINCTঅপারেশন বোঝায় ।

এটি ব্যবহার করার দরকার নেই NOT EXISTSযদি এটি আসলে প্রয়োজন হয় না।

তবে আপনার যে সমস্যাটি হচ্ছে তা সম্ভবত টেবিলের ভেরিয়েবলগুলির সাথে সম্পর্কিত দরিদ্র কার্ডিনালিটির অনুমানের কারণে আপনি আনইনডেক্সড টেবিলে নেস্টেড লুপগুলি পাচ্ছেন।

select * from @temptableNEW
except
select * from @temptableOLD
OPTION (RECOMPILE)

টেবিলগুলির প্রত্যেকটিতে 100 কে সারি রয়েছে এবং এটি আলাদা পরিকল্পনা দেয় তা অ্যাকাউন্ট নিতে সক্ষম হবেন।

এসকিউএল সার্ভার ২০১২-এ আপনি কেবল সীমাবদ্ধতার মাধ্যমে সারণী ভেরিয়েবলগুলিতে সূচিপত্র যুক্ত করতে পারেন। মানগুলি অনন্য হলে আপনি ব্যবহার করতে পারেন

DECLARE @temptableOLD TABLE ([Result1] int UNIQUE CLUSTERED);

একটি সূচক যোগ করতে। উভয় টেবিলগুলিতে করা হয়ে গেলে পরিকল্পনার (পুনরায় সংকলনের ইঙ্গিতটি যুক্ত হওয়ার পরে) সম্ভবত পরিবর্তে একটি সংযুক্তি যোগটি ব্যবহার করবে। কোনও সূচি ছাড়াই আমি একটি হ্যাশ যোগদানের আশা করব।


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

4
@ উইলহিলি #tempটেবিলগুলির টেবিলের ভেরিয়েবলগুলির তুলনায় প্রচুর সুবিধা রয়েছে (পরিসংখ্যান, সমান্তরালতা, আরও নমনীয় সূচক) তাই আপনি যদি সারণি ভেরিয়েবলের মধ্যে সীমাবদ্ধ যেখানে এমন কোনও প্রসঙ্গে ব্যবহার না করেন আপনি সেগুলিও চেষ্টা করতে পারেন।
মার্টিন স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.