পটভূমি
আমার এসকিউএল সার্ভার ২০০৮ আর 2 এর বিপরীতে একটি ক্যোয়ারী চলছে যা প্রায় 12 টি বিভিন্ন "টেবিল"-এ যোগ দেয় এবং / অথবা বাম-যোগ দেয়। 50 মিলিয়ন সারি এবং প্রায় 300 টি আলাদা টেবিলের সাথে অনেকগুলি সারণী সহ ডাটাবেসটি মোটামুটি বড়। এটি একটি বৃহত-ইশ কোম্পানির জন্য যার সারা দেশে 10 টি গুদাম রয়েছে। সমস্ত গুদামগুলি ডাটাবেসে পড়ে এবং লিখতে থাকে। সুতরাং এটি বেশ বড় এবং বেশ ব্যস্ত।
আমার যে ক্যোয়ারী নিয়ে সমস্যা হচ্ছে সেটিকে দেখতে এমন কিছু দেখাচ্ছে:
select t1.something, t2.something, etc.
from Table1 t1
inner join Table2 t2 on t1.id = t2.t1id
left outer join (select * from table 3) t3 on t3.t1id = t1.t1id
[etc]...
where t1.something = 123
লক্ষ্য করুন যে এর মধ্যে একটি যোগ দেয় এমন একটি অন-সম্পর্কযুক্ত সাব-কোয়েরিতে রয়েছে।
সমস্যাটি হ'ল এই সকালে শুরু হওয়া, সিস্টেমে কোনও পরিবর্তন ছাড়াই (যেটি আমি বা আমার দলের যে কেউই জানে), ক্যোয়ারীটি চালাতে প্রায় 2 মিনিট সময় নেয়, চালাতে এক ঘন্টা দেড় ঘন্টা সময় শুরু করে - যখন এটি মোটেই দৌড়ে গেল বাকী ডাটাবেস ঠিক জরিমানা বানাচ্ছে। আমি এই ক্যোয়ারীটি প্রায়শই চলে এমন স্প্রোকের বাইরে নিয়ে এসেছি এবং এসএসএমএস ডাব্লু / হার্ড-কোডেড প্যারামিটার ভেরিয়েবলগুলিতে একই স্বচ্ছলতা দিয়ে চালিয়েছি।
আশ্চর্যের বিষয় হ'ল আমি যখন অ-সম্পর্কিত সম্পর্কযুক্ত সাব-কোয়েরিটি নিই এবং এটি একটি টেম্প টেবিলের মধ্যে ফেলে দিই এবং তারপরে সাব-কোয়েরির পরিবর্তে এটি ব্যবহার করি, ক্যোয়ারীটি ঠিকঠাকভাবে চলে runs এছাড়াও (এবং এটি আমার কাছে সবচেয়ে আশ্চর্যজনক) যদি আমি কোয়েরার শেষে এই টুকরো কোডটি যুক্ত করি তবে ক্যোরিটি দুর্দান্তভাবে চলে:
and t.name like '%'
এই ছোট্ট পরীক্ষাগুলি থেকে আমি সিদ্ধান্ত নিয়েছি (সম্ভবত ভুলভাবে) এসকিউএল এর ক্যাশেড এক্সিকিউশন প্ল্যান কীভাবে সেট আপ করা হয় তার কারণে - ধীরগতির কারণ হ'ল - যখন কোয়েরিটি কিছুটা আলাদা, তখন এটি একটি নতুন এক্সিকিউশন প্ল্যান তৈরি করতে হবে।
আমার প্রশ্নটি হ'ল: যখন কোনও কোয়েরি যা দ্রুত চলতে শুরু করত হঠাৎ রাতের মাঝামাঝি থেকে ধীরে ধীরে চলতে শুরু করে এবং এই একটি ক্যোয়ারী ব্যতীত অন্য কোনও কিছুই প্রভাবিত হয় না, আমি কীভাবে এটির সমস্যা সমাধান করব এবং ভবিষ্যতে কীভাবে তা ঘটে যাওয়া থেকে রক্ষা করব? ? কীভাবে জানবো যে এসকিউএল এটিকে এত ধীর করে দেওয়ার জন্য অভ্যন্তরীণভাবে কী করছে (খারাপ জিজ্ঞাসাটি চলতে থাকলে আমি এর সম্পাদন পরিকল্পনাটি পেতে পারি তবে এটি চলবে না - সম্ভবত প্রত্যাশিত সম্পাদন পরিকল্পনা আমাকে কিছু দেবে?)? যদি এই সমস্যাটি কার্যকর করার পরিকল্পনার সাথে থাকে তবে আমি কীভাবে এসকিউএলকে এমন ভাবনা থেকে দূরে রাখব যে সত্যই কৃপণ বাস্তবায়ন পরিকল্পনাগুলি একটি ভাল ধারণা?
এছাড়াও, প্যারামিটার স্নিফিংয়ের ক্ষেত্রে এটি কোনও সমস্যা নয়। আমি এটি আগে দেখেছি, এবং এটি এটি নয়, যেহেতু আমি যখন এসএসএমএসে ভারিবেলগুলি হার্ড-কোড করি তখনও আমি ধীর পারফরম্যান্স পাই।