আমার কাছে একটি "টপ (এক্স)" ধারা সহ একটি এসকিউএল আপডেট আপডেট রয়েছে এবং আমি যে সারিটিতে মানগুলি আপডেট করছি তাতে প্রায় 4 বিলিয়ন সারি রয়েছে। আমি যখন "টপ (10)" ব্যবহার করি, তখন আমি একটি কার্যকর করার পরিকল্পনা পাই যা প্রায় তাত্ক্ষণিকভাবে কার্যকর করা হয়, কিন্তু যখন আমি "শীর্ষ (50)" বা তার চেয়ে বড় ব্যবহার করি, তখন কোয়েরিটি কখনই (কমপক্ষে অপেক্ষা করার আগে নয়) শেষ হয় না এবং এবং এটি সম্পূর্ণ ভিন্ন কার্যকরকরণ পরিকল্পনা ব্যবহার করে। ছোট ক্যোয়ারী একটি সূচক সন্ধানের এক জোড়া এবং নেস্টেড লুপ যোগ দেওয়ার সাথে একটি খুব সাধারণ পরিকল্পনা ব্যবহার করে, যেখানে একই একই ক্যোয়ারী (ইউপিডিয়া বিবৃতিটির শীর্ষ ধারাটিতে বিভিন্ন সংখ্যক সারি সহ) একটি পরিকল্পনা ব্যবহার করে যাতে দুটি পৃথক সূচী চাওয়া জড়িত , একটি টেবিল স্পুল, সমান্তরালতা এবং অন্যান্য জটিলতার একগুচ্ছ।
আমি "বিকল্প (প্ল্যান ব্যবহার করুন ...)" ব্যবহার করে এটির জন্য ছোট ক্যোয়ারী দ্বারা উত্পাদিত এক্সিকিউশন প্ল্যানটি ব্যবহার করতে বাধ্য করেছি - যখন আমি এটি করি, তখন কয়েক সেকেন্ডের মধ্যে আমি প্রায় 100,000 সারি আপডেট করতে পারি। আমি জানি ক্যোয়ারী পরিকল্পনাটি ভাল, তবে এসকিউএল সার্ভার কেবল নিজেরাই সেই পরিকল্পনাটি বেছে নেবে যখন কেবলমাত্র অল্প সংখ্যক সারি জড়িত থাকে - আমার আপডেটে যে কোনও শালীন বৃহত সারির গণনাটি সাব-অনুকূল পরিকল্পনার ফলস্বরূপ।
আমি ভেবেছিলাম যে সমান্তরালতাটি দোষারোপ হতে পারে, তাই আমি MAXDOP 1
কোয়েরিটি সেট করেছিলাম , তবে কোনও ফলস্বরূপ হয়নি - সেই পদক্ষেপটি চলে গেছে, তবে খারাপ পছন্দ / পারফরম্যান্স হয়নি। sp_updatestats
কারণটি ছিল না তা নিশ্চিত করতে আমি আজ সকালেই ছুটে এসেছি ।
আমি দুটি কার্যকর করার পরিকল্পনা সংযুক্ত করেছি - সংক্ষিপ্ততর একটিও দ্রুত। অধিকন্তু, এখানে প্রশ্নের উত্তর রয়েছে (এটি লক্ষণীয় যে আমি যে নির্বাচনকে অন্তর্ভুক্ত করেছি তা ছোট এবং বড় উভয় সারি গণনার ক্ষেত্রে দ্রুত বলে মনে হচ্ছে):
update top (10000) FactSubscriberUsage3
set AccountID = sma.CustomerID
--select top 50 f.AccountID, sma.CustomerID
from FactSubscriberUsage3 f
join dimTime t
on f.TimeID = t.TimeID
join #mac sma
on f.macid = sma.macid
and t.TimeValue between sma.StartDate and sma.enddate
where f.AccountID = 0 --There's a filtered index on the table for this
আমি কীভাবে আমার ক্যোয়ারী সেট আপ করছি বা বাস্তবায়নের পরিকল্পনায় যেভাবে ক্যোয়ারী ইঞ্জিনটি তৈরি করছে তা বাছাই করা খারাপ পছন্দকে eitherণ দেবে এমনভাবে কি স্পষ্ট কিছু আছে? যদি প্রয়োজন হয় তবে আমি জড়িত সারণির সংজ্ঞা এবং সেগুলির উপরে সংজ্ঞায়িত সূচকগুলিও অন্তর্ভুক্ত করতে পারি।
যারা ডাটাবেস অবজেক্টের একমাত্র পরিসংখ্যান সংস্করণ চেয়েছিলেন তাদের কাছে: আমি বুঝতেও পারি নি যে আপনি এটি করতে পারেন, তবে এটি পুরোপুরি উপলব্ধি করে! আমি একটি পরিসংখ্যান-কেবল ডাটাবেসের জন্য স্ক্রিপ্টগুলি উত্পন্ন করার চেষ্টা করেছি যাতে অন্যরা তাদের জন্য কার্যকর করার পরিকল্পনাগুলি পরীক্ষা করতে পারে তবে আমি আমার ফিল্টারড সূচীতে পরিসংখ্যান / হিস্টোগ্রাম জেনারেট করতে পারি (স্ক্রিপ্টে সিনট্যাক্স ত্রুটি এটি মনে হয়), তাই আমি ভাগ্যের বাইরে। আমি ফিল্টারটি অপসারণের চেষ্টা করেছি এবং ক্যোয়ারীর পরিকল্পনাগুলি খুব কাছাকাছি ছিল, তবে ঠিক একই রকম নয় এবং আমি কাউকে কাউকে কাউকে পাঠাতে চাই না oose
আপডেট এবং আরও কিছু সম্পূর্ণ বাস্তবায়ন পরিকল্পনা: প্রথমে, এসকিউএল সেন্টির প্ল্যান এক্সপ্লোরার একটি অবিশ্বাস্য সরঞ্জাম। আমি এমনকি এই সাইটে অন্যান্য ক্যোয়ারী পরিকল্পনার প্রশ্নগুলি না পাওয়া পর্যন্ত এটির অস্তিত্ব সম্পর্কে জানতাম না, এবং আমার প্রশ্নগুলি কীভাবে কার্যকর করা হচ্ছে তা সম্পর্কে কিছুটা বলার দরকার ছিল। যদিও আমি কীভাবে সমস্যাটি মোকাবেলা করব তা নিশ্চিত নই, সমস্যাটি কী তা তারা এটিকে স্পষ্ট করে দিয়েছিল।
এখানে 10, 100 এবং 1000 টি সারির সংক্ষিপ্তসার রয়েছে - আপনি দেখতে পাচ্ছেন যে 1000 সারি ক্যোয়ারীটি অন্যের সাথে একরকমভাবে বের হওয়ার উপায় নয়:
আপনি দেখতে পাচ্ছেন যে তৃতীয় ক্যোয়ারিতে একটি হাস্যকর সংখ্যা রয়েছে যার ফলে এটি স্পষ্টতই কিছু আলাদা করছে। এখানে সারি গণনা সহ আনুমানিক বাস্তবায়ন পরিকল্পনা। 1000-সারির আনুমানিক বাস্তবায়ন পরিকল্পনা:
এবং এখানে কার্যনির্বাহী পরিকল্পনার আসল ফলাফলগুলি (যাইহোক, "কখনই শেষ হয় না" এর মাধ্যমে দেখা যায়, আমি বোঝাতে চাইছি "এক ঘন্টার মধ্যে শেষ")। 1000-সারি প্রকৃত বাস্তবায়ন পরিকল্পনা
প্রথম যে বিষয়টি আমি লক্ষ্য করেছি সেটি হ'ল, ডিমেটাইম টেবিল থেকে 60K সারি টানার পরিবর্তে এটি প্রত্যাশিত, এটি আসলে একটি বি দিয়ে 1.6 বিলিয়ন টানছে । আমার ক্যোয়ারির দিকে তাকিয়ে, আমি নিশ্চিত না যে এটি ডিমেটাইম টেবিল থেকে কীভাবে অনেকগুলি সারি পিছনে টানছে। আমি যে বিটিউইন অপারেটরটি ব্যবহার করছি তা নিশ্চিত করে যে আমি ফ্যাক্ট টেবিলের সময় রেকর্ডের উপর ভিত্তি করে # ম্যাক থেকে সঠিক রেকর্ডটি টানছি। যাইহোক, আমি যখন ক্লিয়ার ক্লজটিতে একটি লাইন যুক্ত করি যেখানে আমি t.TimeValue (বা t.TimeID) কে একটি মানতে ফিল্টার করি, তখন কয়েক সেকেন্ডের মধ্যে আমি সফলভাবে 100,000 সারি আপডেট করতে পারি। এর ফলস্বরূপ, এবং আমি অন্তর্ভুক্ত কার্যকরকরণ পরিকল্পনাগুলিতে স্পষ্ট করে দিয়েছি যে এটি আমার সময়সীমাটিই সমস্যা is এটা স্পষ্ট but তবে আমি নিশ্চিত নই যে আমি কীভাবে এই সমস্যাটিকে ঘিরে কাজ করতে এবং যথার্থতা বজায় রাখতে যোগদানের মানদণ্ডকে পরিবর্তন করব । কোন চিন্তা?
রেফারেন্সের জন্য, এখানে 100 সারি আপডেটের জন্য পরিকল্পনা (সারি গণনা সহ)। আপনি দেখতে পাচ্ছেন যে এটি একই সূচকটিকে হিট করে এবং এখনও এক টন সারি দিয়ে, তবে সমস্যার একই মাত্রার কাছাকাছি কোথাও নেই। সারি গণনা সহ 100 টি সারি কার্যকরকরণ :
from #mac sma join f on f.macid = sma.macid join dimTime t on f.TimeID = t.TimeID and t.TimeValue between sma.StartDate and sma.enddate
বনামfrom #mac join t on t.TimeValue between sma.StartDate and sma.enddate join f on f.TimeID = t.TimeID and f.macid = sma.macid
TOP 50
এখনও দ্রুত কার্যকর করা উচিত। আপনি এক্সএমএল পরিকল্পনা আপলোড করতে পারেন? আমার সারি সংখ্যার দিকে নজর দেওয়া দরকার। আপনি TOP 50
ম্যাক্সডপ 1 দিয়ে এবং একটি নির্বাচন হিসাবে চালাতে পারেন , আপডেট হিসাবে নয় এবং পরিকল্পনাটি পোস্ট করতে পারেন? (অনুসন্ধানের স্থানটিকে সরল করার / দ্বিখণ্ডিত করার চেষ্টা করা)।
t.TimeValue between sma.StartDate and sma.enddate
অনেক বেশি অব্যর্থ সারি তৈরি হতে পারে যা পরবর্তীতে ফ্যাক্টসউসক্রাইবারের বিরুদ্ধে যোগদানের ফলে ফিল্টার হয়ে যায় এবং চূড়ান্ত ফলাফলটিতে শেষ না হয়।
sp_updatestatistics
টেবিলে একটি চালানো আছে ?