আমি এসকিউএল অপ্টিমাইজেশনের পরে কিছুদিন আগে এটি নিয়ে ভাবছিলাম। আমি মনে করি যে আমরা এসকিউএল একটি উইকিপিডিয়া সংজ্ঞা একটি "ঘোষিত ভাষা" হিসাবে সম্মত হতে পারে:
প্রোগ্রামিং দৃষ্টান্ত যা তার নিয়ন্ত্রণ প্রবাহকে বর্ণনা না করেই গণনার যৌক্তিকতা প্রকাশ করে
আপনি যদি ভাবেন যে পর্দার আড়ালে কতগুলি জিনিস করা হয় (পরিসংখ্যানগুলির দিকে তাকানো, কোনও সূচক কার্যকর কিনা তা স্থির করে, নেস্টেড, মার্জড বা হ্যাশ যোগ দেওয়ার জন্য যাচ্ছেন ইত্যাদি .. ইত্যাদি ..) আমাদের অবশ্যই স্বীকার করতে হবে যে আমরা কেবল একটি উচ্চ স্তর দিই যুক্তি এবং ডাটাবেস সমস্ত নিম্ন স্তরের নিয়ন্ত্রণ প্রবাহ যুক্তির যত্ন নিয়েছিল।
এছাড়াও এই পরিস্থিতিতে, কখনও কখনও ডাটাবেস অপ্টিমাইজারকে সর্বোত্তম ফলাফল দেওয়ার জন্য ব্যবহারকারীর কাছ থেকে কিছু "ইঙ্গিত" লাগে।
"ঘোষিত" ভাষার আর একটি সাধারণ সংজ্ঞা হ'ল (আমি কোনও লেখক উত্স খুঁজে পাই না):
প্রোগ্রামিং দৃষ্টান্ত যা অর্জনের পদক্ষেপগুলি বর্ণনা না করেই গণনার কাঙ্ক্ষিত ফলাফলকে প্রকাশ করে ("কীভাবে নয় কী" বর্ণনা দিয়ে সংক্ষেপে)
আমরা যদি এই সংজ্ঞা গ্রহণ করি তবে আমরা ওপি দ্বারা বর্ণিত সমস্যাগুলির মুখোমুখি হই।
প্রথম সমস্যাটি হ'ল এসকিউএল আমাদের "একই ফলাফল" সংজ্ঞায়িত করার জন্য একাধিক সমতুল্য উপায় দেয়। সম্ভবত এটি একটি প্রয়োজনীয় মন্দ: আমরা কোনও ভাষাকে যত বেশি ভাববাদী শক্তি দেই, তত বেশি একই জিনিস প্রকাশের বিভিন্ন উপায় থাকতে পারে।
উদাহরণ হিসাবে, আমাকে একবার এই জিজ্ঞাসাটি অনুকূল করতে বলা হয়েছে:
SELECT Distinct CT.cust_type, ct.cust_type_description
from customer c
INNER JOIN
Customer_type CT on c.cust_type=ct.cust_type;
যেহেতু প্রকারগুলি গ্রাহকের চেয়ে অনেক কম ছিল এবং cust_type
গ্রাহক টেবিলে একটি সূচক ছিল , তাই আমি এগুলি আবার লিখে এটির মাধ্যমে একটি দুর্দান্ত উন্নতি অর্জন করেছি:
SELECT CT.cust_type, ct.cust_type_description
from Customer_type CT
Where exists ( select 1 from customer c
Where c.cust_type=ct.cust_type);
এই সুনির্দিষ্ট ক্ষেত্রে, যখন আমি বিকাশকারীকে তিনি কী অর্জন করতে চান তা জিজ্ঞাসা করে তিনি আমাকে বলেছিলেন "আমি যে সমস্ত গ্রাহক প্রকারের জন্য আমার কমপক্ষে একজন গ্রাহক ছিল সেগুলি চেয়েছিলাম", ঘটনাক্রমে ঠিক কীভাবে অপ্টিমাইজার ক্যোয়ারী বর্ণনা করা যেতে পারে।
সুতরাং, যদি আমি একটি সমতুল্য এবং আরও দক্ষ ক্যোয়ারী পেতে পারি তবে কেন অপ্টিমাইজার একই কাজ করতে পারে না?
আমার সেরা অনুমান যে এটি দুটি প্রধান কারণে:
এসকিউএল যুক্তি প্রকাশ করে:
যেহেতু এসকিউএল উচ্চ-স্তরের যুক্তি প্রকাশ করে, আমরা কী সত্যই অপ্টিমাইজারটি আমাদের এবং আমাদের যুক্তিটিকে "আউটসামার্ট" করতে চাই? আমি উত্সাহের সাথে "হ্যাঁ" চেঁচিয়ে বলব যদি এটি যদি সমস্ত সময় না হয় তবে আমাকে অপটিমাইজারকে সবচেয়ে কার্যকর মৃত্যুদন্ডের পথ বেছে নিতে বাধ্য করা হয়েছিল। আমি মনে করি যে এই ধারণাটি অপ্টিমাইজারটিকে সর্বোত্তমভাবে কাজ করার অনুমতি দেয় (আমাদের যুক্তি সংশোধনও করে) তবে কিছু পাগল হওয়ার সময় উদ্ধার করতে আমাদের একটি "ইঙ্গিত প্রক্রিয়া" দেবে (এটি হুইল + ব্রেক থাকার মতো হবে) একটি স্বায়ত্তশাসিত গাড়ি)।
আরও পছন্দ = আরও সময়
এমনকি সেরা আরডিবিএমএস অপ্টিমাইজারও সমস্ত কার্যকর সম্পাদনের পাথগুলি পরীক্ষা করে না, কারণ এগুলি অবশ্যই সত্যই দ্রুত হওয়া উচিত: 100 মিমি থেকে 10 মিমি পর্যন্ত যদি কোন বারের জন্য 100 মিনিট সেরা পথ বেছে নেওয়ার দরকার হয় তবে কোনও ক্যোয়ারী অনুকূল করা কত ভাল হবে? এবং এটি আমাদের "উচ্চ-স্তরের যুক্তি" সম্মান করে অপ্টিমাইজারের সাথে। এটিতে যদি সমস্ত সমতুল্য এসকিউএল কোয়েরিগুলিও পরীক্ষা করা উচিত তবে অপটিমাইজারের সময়টি একাধিকবার বাড়তে পারে।
আরডিবিএমএসের কোনও পুনঃলিখনের ক্যোয়ারির আরও একটি ভাল উদাহরণ হ'ল ( এই আকর্ষণীয় ব্লগ পোস্ট থেকে )
SELECT t1.id, t1.value, SUM(t2.value)
FROM mytable t1
JOIN mytable t2
ON t2.id <= t1.id
GROUP BY t1.id, t1.value;
এই হিসাবে লেখা যেতে পারে (বিশ্লেষণমূলক ফাংশন প্রয়োজন)
SELECT id, value, SUM(t1.value) OVER (ORDER BY id)
FROM mytable
select whatever from sometable where FKValue in (select FKValue from sometable_2 where other_value = :param)
। এটি কীভাবে একটিexists
বা একটি দিয়ে পুনরায় সেট করা যায় তা দেখতে তুচ্ছ হওয়া উচিতjoin
।