আপনি যখন ORDER BY
কোনও UNION
এসএসকিএল এর সাথে মিলিতভাবে সাব-কোয়েরির অভ্যন্তরীণ একটি ক্লজ ব্যবহার করেন তখন এই ORDER BY
ধারাটি অপ্টিমাইজ করবে ।
এটি কারণ ডিফল্টরূপে একটি UNION
আনর্ডারড তালিকা ফিরিয়ে দেয় তাই কোনও ORDER BY
কিছুই করবে না।
অপ্টিমাইজেশনের ডক্সে উল্লেখ করা হয়েছে এবং বলেছেন:
কোনও পৃথক নির্বাচনের মাধ্যমে অর্ডার বা লিমিট প্রয়োগ করতে, নির্বাচনটি বন্ধ করে দেওয়া বন্ধনীগুলির মধ্যে এই ধারাটি রাখুন:
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
যাইহোক, পৃথক নির্বাচনী বিবৃতিগুলির জন্য অর্ডার বাই ব্যবহারের ফলে সারিগুলি চূড়ান্ত ফলাফলের ক্রম হিসাবে প্রদর্শিত হয় সে সম্পর্কে কিছুই বোঝায় না কারণ ইউনিয়ন ডিফল্টরূপে সারিগুলির একটি সীমানাবিহীন সেট তৈরি করে। সুতরাং, এই প্রসঙ্গে অর্ডার ব্যবহারের বিষয়টি সাধারণত সীমাবদ্ধতার সাথে একত্রে ব্যবহৃত হয়, যাতে এটি নির্বাচিত সারিগুলির উপসেট নির্ধারণ করতে ব্যবহৃত হয় নির্বাচিত জন্য পুনরুদ্ধার করার জন্য, যদিও এটি প্রয়োজনীয়ভাবে সেই সমস্ত সারিগুলির ক্রমকে প্রভাবিত করে না চূড়ান্ত ইউনিয়ন ফলাফল। যদি অর্ডার বাই কোনও সীমাতে লিমিট ছাড়াই উপস্থিত হয়, তবে এটি অপ্টিমাইজ করা হয়েছে কারণ এটি কোনওভাবেই প্রভাব ফেলবে না।
এর শেষ বাক্যটি কিছুটা বিভ্রান্তিকর কারণ এটির একটি প্রভাব থাকতে হবে। আপনি যখন সাব-কোয়ারির মধ্যে অর্ডার দেওয়ার দরকার এমন পরিস্থিতিতে থাকেন তখন এই অনুকূলকরণটি সমস্যার সৃষ্টি করে a
মাইএসকিউএলকে এই অপটিমাইজেশনটি না করার জন্য বাধ্য করার জন্য আপনি এর মতো একটি লিমিটেড ধারা যুক্ত করতে পারেন:
(SELECT 1 AS rank, id, add_date FROM my_table WHERE distance < 5 ORDER BY add_date LIMIT 9999999999)
UNION ALL
(SELECT 2 AS rank, id, add_date FROM my_table WHERE distance BETWEEN 5 AND 15 ORDER BY rank LIMIT 9999999999)
UNION ALL
(SELECT 3 AS rank, id, add_date from my_table WHERE distance BETWEEN 5 and 15 ORDER BY id LIMIT 9999999999)
একটি উচ্চ LIMIT
মানে হল আপনি OFFSET
যদি পৃষ্ঠাগুলির মতো কিছু করতে চান তবে সামগ্রিক ক্যোয়ারিতে একটি যুক্ত করতে পারেন could
এটি আপনাকে ORDER BY
প্রতিটি ইউনিয়নের জন্য বিভিন্ন কলামে সক্ষম হওয়ার অতিরিক্ত সুবিধাও দেয় ।