কেন নেস্টেড লুপগুলি কেবল বাম যোগদানগুলিতে সমর্থন করে?


11

ক্রেগ ফ্রিডম্যানের ব্লগে নেস্টেড লুপস জয়েনে তিনি ব্যাখ্যা করেছেন যে নেস্টেড লুপগুলি কেন যোগদান করে একটি সঠিক বাহ্যিক যোগদানকে সমর্থন করতে পারে না:

সমস্যাটি হ'ল আমরা একাধিকবার অভ্যন্তরীণ টেবিলটি স্ক্যান করি - একবার বাইরের জোড়ের প্রতিটি সারির জন্য। এই একাধিক স্ক্যানের সময় আমরা একই অভ্যন্তরীণ সারিগুলি একাধিকবার মুখোমুখি হতে পারি। কোন পর্যায়ে আমরা উপসংহারে পৌঁছাতে পারি যে কোনও নির্দিষ্ট অভ্যন্তরীণ সারিটি যোগ দেয় না বা যোগ দেয় না?

কেউ কি দয়া করে এটি খুব সাধারণ এবং শিক্ষামূলক উপায়ে ব্যাখ্যা করতে পারেন?

এর অর্থ কী লুপটি বাইরের টেবিল ( R1) দিয়ে শুরু হয় এবং অভ্যন্তরীণ ( R2) স্ক্যান করে ?

আমি বুঝতে পারি যে একটি R1মানের সাথে যোগ দেয় না তার জন্য R2এটি এমন একটি প্রতিস্থাপন করা উচিত NULLযাতে ফলাফল সেটটি ( NULL, R2) হয়ে যায় । আমার জন্য যোগদান করা না R2হলে R1কোনও মান ফিরিয়ে দেওয়া অসম্ভব বলে মনে হয় যে কারণে কোন মানটি ফেরত দিতে হবে তা তা জানতে পারে না R2। তবে এটি ব্যাখ্যা করার উপায় নয়। অথবা এটা?

এসকিউএল সার্ভার প্রকৃতপক্ষে এর সাথে অনুকূলকরণ (এবং প্রায়শই প্রতিস্থাপন করে) RIGHT JOINকরে LEFT JOINতবে প্রশ্নটি ব্যাখ্যা করার কারণ এটি কেন / সমর্থন যুক্তি ব্যবহারের জন্য প্রযুক্তিগতভাবে অসম্ভব ।NESTED LOOPS JOINRIGHT JOIN

উত্তর:


12

এখানে মূল বিষয়টি হ'ল নেস্টেড লুপগুলি ব্যবহার করে একটি বাহ্যিক জোড় প্রয়োগ, প্রযুক্তিগত উপায়ে যা যৌক্তিক উপায়ে বিপরীত হয় , যেখানে অভ্যন্তরীণ টেবিলটি বাইরের লুপের মাধ্যমে অ্যাক্সেস করা হয় এবং বাইরের টেবিলটি অভ্যন্তরীণ লুপের মাধ্যমে অ্যাক্সেস করা হয় ।

A এবং B সারণী দেওয়া হয়েছে, আসুন বাস্তবায়ন করি A LEFT JOIN B

A
--
1
2

B
_
1
3

প্রথমে আসুন এটি " প্রাকৃতিক " উপায়ে করুন।

আমরা এ এর ​​মাধ্যমে পুনরাবৃত্তি
করি আমরা রেকর্ড 1 এ অ্যাক্সেস
করি B.
আমরা বি এর মাধ্যমে পুনরাবৃত্তি করি আমরা বিতে রেকর্ড 1 এবং আউটপুট 1-1 পেয়েছি

আমরা এ এর ​​মাধ্যমে পুনরাবৃত্তি করি We
আমরা রেকর্ডটি অ্যাক্সেস করি ২.
আমরা বি দিয়ে পুনরাবৃত্তি
করি আমরা বি তে কোনও মিল খুঁজে পাই না
We আমরা আউটপুট ২-নাল করি

এখন, এটি " বিপরীত " উপায়ে করা যাক।

আমরা বি এর মাধ্যমে পুনরাবৃত্তি
করি আমরা রেকর্ড 1
এ অ্যাক্সেস করি A.
আমরা এ এর মাধ্যমে পুনরাবৃত্তি করি আমরা A এ রেকর্ড 1 এবং আউটপুট 1-1 পেয়েছি

আমরা বি মাধ্যমে iterating রাখা
আমরা রেকর্ড 3. অ্যাক্সেস
উ মাধ্যমে আমরা বারবার
আমরা উ: যে কোন মিল খুঁজে না

এখন মনে রাখবেন এটি ছিল A LEFT JOIN B, যার অর্থ 1-1 ছাড়াও আমাদের আউটপুট 2-নাল করা উচিত ।
সমস্যাটি হ'ল সেই মুহুর্তে, আমাদের কোন ধারণা নেই যে কোন রেকর্ড আইডি এর জন্য ইতিমধ্যে আমাদের একটি ম্যাচ আছে (1) এবং কোন রেকর্ডের জন্য আমরা নেই (2)।


এটি আসলে বিভিন্ন উপায়ে সমাধান করা যেতে পারে যেমন টেবিল এ এর ​​জন্য কিছুটা অ্যারে ধরে রেখে
যখন কোনও রেকর্ড ম্যাচ হিসাবে পাওয়া যায় তখন আমরা এটিকে বিট অ্যারেতে চিহ্নিত করি।
নেস্টেড লুপগুলির শেষে আমরা বিট অ্যারে এবং আউটপুট এবং আউটপুট দিয়ে যাচ্ছি যা চিহ্নিত হয়নি।
এটি সম্ভবত "প্রাকৃতিক" নেস্টেড লুপের চেয়ে জটিল।


13

লিঙ্কযুক্ত নিবন্ধে যা আমি পছন্দ করি না তা হ'ল "নেস্টেড লুপ জোনের অ্যালগোরিদম ডান জোড়ার যৌক্তিক জোড় অপারেটরকে সমর্থন করে না"

যদিও সীমাবদ্ধতা রয়েছে, এই সময়ে শব্দটি কিছুটা বিভ্রান্তিকর। আমি আশা করি নিম্নলিখিত বিষয়গুলি আরও ভালভাবে ব্যাখ্যা করেছে:

নেস্টেড লোপ জোড় আলগোরিদিমে দুটি টেবিল জড়িত (বেস টেবিলগুলি বা পূর্ববর্তী ক্রিয়াকলাপগুলির ফলাফল সেটগুলি অপ্রাসঙ্গিক কিনা) যা বাইরের এবং অভ্যন্তরীণ সারণীর নামকরণ করা হয় এবং এগুলিকে অ্যালগরিদম দ্বারা পৃথক উপায়ে চিকিত্সা করা হয় ("বাইরের" টেবিলটি বাইরের দিকে বিভক্ত হয় লুপ এবং অভ্যন্তরীণ লুপগুলিতে "অভ্যন্তরীণ" টেবিল)।

সুতরাং, আসুন আমরা বলি যে আমাদের একটি যোগদান আছে:

A (some_type) JOIN B

অ্যালগরিদম হয় হিসাবে কার্যকর করা যেতে পারে:

outer-loop-A  nested-loop  inner-loop-B

বা:

outer-loop-B  nested-loop  inner-loop-A

এখন, যদি ( some_type) থাকে INNERবা CROSSযোগদান করে, তবে কোনও সীমাবদ্ধতা নেই, পরিকল্পনাকারী দুটি পদ্ধতির মধ্যে (সেটগুলির আকারের উপর নির্ভর করে, যোগদানকৃত কলাম, সূচিপত্র ইত্যাদির মান বিতরণ ইত্যাদির উপর নির্ভর করে বিভিন্ন পারফরম্যান্স বৈশিষ্ট্য সহ) চয়ন করতে পারেন । সাধারণত ক্ষুদ্রতম টেবিলটি অ্যালগোরিদমের "বহিরাগত" টেবিল হিসাবে বেছে নেওয়া হবে)।

কিন্তু যখন some_typeহয় LEFTযোগদানের, এটি শুধুমাত্র ব্যবহার করতে পারেন:

outer-loop-A  nested-loop  inner-loop-B

এবং না

outer-loop-B  nested-loop  inner-loop-A

এবং যেহেতু RIGHTকোনওটিকে সর্বদা LEFTযোগদান হিসাবে পুনরায় লেখা যায় , বিপরীতে এর একই সীমাবদ্ধতা থাকে। এর জন্য A RIGHT JOIN B(যা আবার লিখিত হতে পারে B LEFT JOIN A) এটি কেবলমাত্র ব্যবহার করতে পারে:

outer-loop-B  nested-loop  inner-loop-A

এবং অন্যদিকে না *

একই সীমাবদ্ধতা বাম-আধা সেমজয়াইন, বাম-অ্যান্টি-সেমিজাইন, ডান-সেমিজাইন এবং ডান-অ্যান্টি-সেমিজয়িনের ক্ষেত্রে প্রযোজ্য।

FULLঅন্যদিকে এ যোগ সরাসরি একটি নেস্টেড লুপ সঙ্গে পরিচালনা করা যাবে না অ্যালগরিদম যোগদান করুন। নিবন্ধটি খুব ভালভাবে ব্যাখ্যা করেছে (এটি শেষের কাছাকাছি) কীভাবে একটি পূর্ণ যোগদানটি বাম জোড় এবং একটি বাম অ্যান্টি-সেমিজাইন একটি ইউনিয়ন যা আবার দুটি নেস্ট লুপ হিসাবে পরিকল্পনা করা যেতে পারে (এবং একটি মিলন).

* যেমন দুদু মার্কোভিটস তার উত্তরে ব্যাখ্যা করেছেন, বিপরীত উপায়টি ব্যবহার করতে সক্ষম হবেন তবে কেবলমাত্র যদি আমরা নেস্টেড-লুপটি সংশোধন করি তবে অতিরিক্ত কাঠামো এবং শেষ পর্যন্ত একটি অতিরিক্ত পদক্ষেপ নিতে।


ভাল, যে অনেক স্পষ্ট করে। আপনার উত্তর দুদু এম এর সাথে মিলিয়ে এটি খুব ভালভাবে ব্যাখ্যা করেছে!
গর্ডনলিডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.