আমার একটি ক্যোয়ারী রয়েছে যা কয়েকটি টেবিলগুলিতে যোগদান করে এবং বেশ খারাপভাবে সম্পাদন করে - সারি অনুমানগুলি (এক 1000 বার) বন্ধ এবং নেস্টেড লুপস জয়েন বেছে নেওয়া হয়, যার ফলে একাধিক টেবিল স্ক্যান হয়। কোয়েরির আকৃতিটি মোটামুটি সোজা, এরকম কিছু দেখতে:
SELECT t1.id
FROM t1
INNER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id
LEFT OUTER JOIN t4 ON t3.t4_id = t4.id
WHERE t4.id = some_GUID
ক্যোয়ারির সাথে চারপাশে খেলতে, আমি লক্ষ্য করেছি যে যখন আমি একটির সাথে যোগ দেওয়ার জন্য মার্জ যোগটি ব্যবহার করার ইঙ্গিত দিচ্ছি তখন এটি বহুগুণ দ্রুত চলে। এটি আমি বুঝতে পারি - যুক্ত হওয়া ডেটার জন্য মার্জ জয়েন একটি ভাল বিকল্প, তবে এসকিউএল সার্ভার সঠিকভাবে নেস্টেড লুপগুলি বেছে নেওয়ার অনুমান করে না।
যা আমি পুরোপুরি বুঝতে পারি না তা কেন এই যোগদানের ইঙ্গিতটি সমস্ত পরিকল্পনা অপারেটরগুলির সমস্ত অনুমানকে পরিবর্তন করে? বিভিন্ন নিবন্ধ এবং বই পড়া থেকে, আমি ধরে নিয়েছি যে পরিকল্পনাটি তৈরির আগে কার্ডিনালিটির অনুমান করা হয়, সুতরাং কোনও ইঙ্গিত ব্যবহার করে অনুমানগুলি পরিবর্তিত হত না, বরং স্পষ্টভাবে এসকিউএল সার্ভারকে একটি নির্দিষ্ট শারীরিক যোগদানের প্রয়োগটি ব্যবহার করতে বলি।
যাইহোক, আমি যা দেখছি তা হল যে মার্জ ইঙ্গিতটি সমস্ত অনুমানকে বেশ নিখুঁত করে তোলে। কেন এটি ঘটে এবং কোয়েরি অপ্টিমাইজারটি কোনও ইঙ্গিত ছাড়াই আরও ভাল অনুমান করা যায় - এমন পরিসংখ্যান স্পষ্টতই এর জন্য অনুমতি দেয় তা বিবেচনা করে?
ইউপিডি: অজ্ঞাতনামা কার্যকরকরণের পরিকল্পনাগুলি এখানে পাওয়া যাবে: https ://www.DPboxboxss/hchfuru35qqj89s/ विसর_join.sqlplan?dl=0 https://www.rodbox.com/s/38sjtv0t7vjjfdp/no_hints_join.sqlplan?dl = 0
আমি টিএফ 3604, 9292 এবং 9204 ব্যবহার করে উভয় প্রশ্নের দ্বারা ব্যবহৃত পরিসংখ্যানগুলি পরীক্ষা করেছি এবং সেগুলি অভিন্ন। তবে যে সূচিগুলি স্ক্যান করা / সন্ধান করা হয়েছে তা প্রশ্নের মধ্যে পৃথক।
তদ্ব্যতীত, আমি কোয়েরিটি চালানোর চেষ্টা করেছি OPTION (FORCE ORDER)
- এটি প্রতিটি সংযুক্তির জন্য হ্যাশ ম্যাচটি বেছে নেওয়ার সাথে সংযুক্ত হয়ে যোগদানের চেয়ে আরও দ্রুত চলে।