JOIN কীওয়ার্ড ব্যবহার করে বা না


45

নিম্নলিখিত এসকিউএল অনুসন্ধানগুলি একই:

SELECT column1, column2
FROM table1, table2
WHERE table1.id = table2.id;

SELECT column1, column2
FROM table1 JOIN table2 
ON table1.id = table2.id;

এবং অবশ্যই আমি চেষ্টা করেছি এমন প্রতিটি ডিবিএমএসে একই ক্যোয়ারী পরিকল্পনার ফলাফল।

তবে প্রতিবার প্রায়শই আমি একটি মতামত পড়ি বা শুনি যে একজন অবশ্যই অন্যজনের চেয়ে ভাল। স্বাভাবিকভাবেই, এই দাবিগুলি কোনও ব্যাখ্যা দিয়ে প্রমাণিত হয় না।

যেখানে আমি কাজ করি, দ্বিতীয় সংস্করণটি অন্যান্য ডিভের বেশিরভাগ লোকের দ্বারা অনুগ্রহযোগ্য বলে মনে হয় এবং তাই আমি আশ্চর্য হ্রাস করার জন্য সেই স্টাইলের দিকেও ঝোঁক করি। তবে মনে মনে আমি প্রথমটি ভাবছি (যেহেতু আমি এটি প্রাথমিকভাবে শিখেছি)।

এই ফর্মগুলির মধ্যে একটির কি অন্যের তুলনায় উদ্দেশ্যমূলকভাবে ভাল? যদি তা না হয় তবে একে অপরকে ব্যবহার করার কারণগুলি কী হবে?


1
কেন এটির প্রোফাইল না করে আমাদের বাকী সবাইকে ফলাফলটি জানাতে দিন? সাধারণভাবে বলতে গেলে, পারফরম্যান্স শৈলীর পছন্দকে ছাড়িয়ে যায়।
ডেমিয়ান ব্রেচেট

3
"আমি যে কোনও ডিবিএমএসে চেষ্টা করেছি তার একই ক্যোয়ারী পরিকল্পনার ফলস্বরূপ" যদি পারফরম্যান্সের দিক থেকে এর কোনও উত্তর থাকতে পারে তবে এটি স্ট্যাকওভারফ্লো ডটকম এ জিজ্ঞাসা করত। হায়রে, তারা একই প্রশ্ন।
সিঙ্গেলাইজেশন ইলিমিনেশন

আহ .. মিস করেছেন যে :)
ডেমিয়ান ব্রেচট

2
"বিষয়বহুল" এর অর্থ "আপনার মতামত কি" তা নয়। আমি সম্পাদনা ধরনের দেখা মানদণ্ড পরিপূর্ণ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী
অ্যারোনআউট

আশ্চর্য হ্রাস করার জন্য আমি সেই স্টাইলের দিকেও ঝুঁকছি আমার মনে হয় আপনি কেবল নিজের প্রশ্নের উত্তর দিয়েছেন। আশ্চর্য খারাপ।
পিটার বি

উত্তর:


60

আমি দেখতে পাচ্ছি যে দ্বিতীয় ফর্মটি আরও ভাল। এটি হতে পারে কারণ এটি আমি এটি শিখেছি, আমি স্বীকার করব, তবে আমার কাছে এর একটি ਠੋਸ কারণ রয়েছে - উদ্বেগের বিচ্ছেদ। সারণিতে যোগদানের জন্য আপনি যে ক্ষেত্রগুলি ব্যবহার করছেন সেগুলি স্থাপন করা যেখানে ক্লজটি কোয়েরিগুলি বুঝতে অসুবিধা হতে পারে।

উদাহরণস্বরূপ, নিম্নলিখিত কোয়েরি নিন:

select *
from table1, table2, table3, table4
where table1.id = table2.id
and table2.id = table3.id
and table3.id = table4.id
and table1.column1 = 'Value 1'

উপরের ক্যোয়ারিতে সারণী যোগদানের শর্ত এবং প্রকৃত ব্যবসায়িক যুক্তি শর্তগুলি সমস্ত একক জায়গাতে মিলিত হয়েছে। একটি বড় প্রশ্ন সহ, এটি বোঝা খুব কঠিন হতে পারে।

তবে, এখন এই কোডটি নিন:

select *
from table1 join table2 on table1.id = table2.id
join table3 on table2.id = table3.id
join table4 on table3.id = table4.id
where table1.column1 = 'Value 1'

এই ক্ষেত্রে, সারণীগুলির সাথে সম্পর্কিত যা কিছু আছে বা সেগুলি কীভাবে সম্পর্কিত তা সবই ধারা থেকে বিচ্ছিন্ন, অন্যদিকে প্রশ্নের সীমাবদ্ধতার জন্য আসল ব্যবসায়ের যুক্তি যেখানে ধারাটিতে রয়েছে। আমি মনে করি এটি বিশেষত বৃহত্তর প্রশ্নের জন্য আরও অনেক বেশি বোধগম্য।


এটি করার একমাত্র বুদ্ধিমান উপায়, বিশেষত একবার আপনি দুটি টেবিলের অতীত হয়ে গেলে বা বাম, ডান এবং পুরো সংযুক্তির সংমিশ্রণের প্রয়োজন হয়।
অগ্লসম্যান

5
+1 "করতে উদ্বেগ বিচ্ছেদ" জন্য, সমবেত তথ্য যোগদান করে যেখানে ক্লজ আপনি আগ্রহী ডেটার সাব-সেট নির্বাচন নির্দেশ।

39

যোগদানের সিনট্যাক্সটি 1992 সালে পুরাতন কমা সিনট্যাক্সকে প্রতিস্থাপন করেছিল currently বর্তমানে কমা সিনট্যাক্সের সাথে কোড লেখার কোনও কারণ নেই। আপনি কিছুই লাভ করেন না এবং আপনি কিছু সমস্যার মুখোমুখি হোন যাতে আপনার স্পষ্টভাবে বাক্য গঠন না হয় simply

প্রথমদিকে যেমন আপনি আরও জটিল প্রশ্নগুলি পেয়েছেন তেমন কোনও শর্ত মিস না করে একটি দুর্ঘটনাজনক ক্রস জয়েন করা খুব সহজ। এটি এমন একটি বিষয় যা স্পষ্টভাবে যোগদানের সিনট্যাক্সটি ঘটতে বাধা দিতে পারে কারণ আপনি একটি সিনট্যাক্স ত্রুটি পাবেন।

যদি আপনি কোনও ক্রস জয়েনের পরিকল্পনা করেন তবে সুস্পষ্ট যোগদানের বাক্য গঠনটি সেই বিষয়টি পরিষ্কার করে দেবে, তবে রক্ষণাবেক্ষণের ক্ষেত্রে অন্তর্নিহিত সিনট্যাক্সে কেউ ধরে নিতে পারে যে আপনি যেখানে ক্লজটি যুক্ত করতে ভুলে গেছেন।

তারপরে বাম এবং ডান সংযুক্তির সমস্যা রয়েছে যা অন্তত অন্তর্নির্মিত বাক্য গঠন ব্যবহার করে কমপক্ষে কিছু ডিবিএসে সমস্যাযুক্ত। এগুলি এসকিউএল সার্ভারে অবনতিযুক্ত এবং বাস্তবে পুরানো সংস্করণগুলিতেও সত্যিকারের ফলাফল সঠিকভাবে দেয় না। বাহ্যিক যোগদানের দরকার নেই এমন কোনও কোয়েরিতে এসকিউএল সার্ভারে অন্তর্নিহিত বাক্য গঠন থাকতে হবে।

তদ্ব্যতীত, আমি এখানে এবং অন্যান্য সাইটগুলিতে প্রশ্নগুলি দেখেছি যেখানে লোকেরা অন্তর্নিহিত এবং স্পষ্টত যোগ দেয় (উদাহরণস্বরূপ বাম জোড় যোগ করার সময়) মিশ্রিত হওয়ার সময় ভুল ফলাফল ঘটে so

অবশেষে অনেক লোক যারা অন্তর্ভুক্ত যোগদান ব্যবহার করে তারা আসলে যোগদানের বিষয়টি বুঝতে পারে না। এটি একটি সমালোচনামূলক বোঝাপড়া যা আপনাকে অবশ্যই একটি ডেটাবেসকে কার্যকরভাবে জিজ্ঞাসা করতে হবে।


ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ. যখন আমাকে শেখানো হয়েছিল তখন আমাদের উভয়টি সিনট্যাক্স দেখানো হয়েছিল, তবে পার্থক্যটি ব্যাখ্যা করা হয়নি। আমি মাঝে মাঝে নিখোঁজ হয়ে কোয়েরি তৈরি করতে পেরেছিলাম যেখানে কোনটি স্পষ্টভাবে প্রথম স্থানে যোগদানের চেয়ে লেখার পরিমাণ বাড়িয়ে দিয়েছিল।
অবিকৃত

8

হা। পোস্টগ্র্রেএসকিউএল- র ডকুমেন্টেশন দেখার সময় আমি আমার নিজের প্রশ্নের একটি সম্ভাব্য উত্তর খুঁজে পেতে পেরেছি । কি এই পৃষ্ঠার ব্যাখ্যা সারসংক্ষেপে, ফলে ক্যোয়ারী এখনও একই, কিন্তু সংখ্যা পরিকল্পনা অপটিমাইজার অবশ্যই বিবেচনা যোগদান সংখ্যা সঙ্গে ব্যাখ্যা মূলকভাবে বৃদ্ধি।

এই জাতীয় প্রায় ছয়টি যোগদানের পরে, সংখ্যাটি এতটাই দুর্দান্ত যে ক্যোয়ারী করার পরিকল্পনা করার সময়টি লক্ষণীয় হতে পারে এবং প্রায় দশটার পরে, অপ্টিমাইজার পরিকল্পনাগুলির একটি বিস্তৃত অনুসন্ধান থেকে সম্ভাব্য অনুসন্ধানে স্যুইচ করবে এবং সর্বোত্তম পরিকল্পনায় না পৌঁছতে পারে ।

একটি রান-টাইম প্যারামিটার সেট করে, আপনি পরিকল্পনাকারীকে সুস্পষ্টভাবে উল্লিখিত অভ্যন্তরীণ এবং ক্রসের সাথে অন্তর্ভুক্ত যোগদানের থেকে আলাদাভাবে আচরণ করতে, তাদের পরিকল্পনার শীর্ষে জোর করে, এবং অন্যান্য বিকল্পগুলি অন্বেষণ না করার জন্য নির্দেশ দিতে পারেন।

উল্লেখ্য, উভয় ক্ষেত্রেই ডিফল্ট আচরণ একই রকম হয় এবং বিকল্প পরিকল্পনা পাওয়ার জন্য ডিবিএমএসের অভ্যন্তরীণ এবং আলাদা আলাদা ফলাফলের জন্য প্রশ্নের মধ্যে থাকা টেবিলগুলির বিশেষত্ব সম্পর্কে জ্ঞান প্রয়োজন


2
তবে আপনি এই দস্তাবেজগুলিকে কিছুটা ভুল বুঝে ফেলেছেন। প্রথমত, আসলে তিনটি প্রান্তিক রয়েছে। আপনার ইঙ্গিত হিসাবে GEQO কে গুলি করে একজন; অন্য দু'জন (পতনের সীমা থেকে এবং যোগদানের ক্ষেত্রে) যোগ পরিকল্পনাকে পুনরায় সংগঠিত করার পরিবর্তে প্রযোজক সূচকগুলি বাছাইয়ের জন্য পরিকল্পনাকারীকে আটকে রাখে। দ্বিতীয়ত এবং ঠিক তেমনি গুরুত্বপূর্ণ, প্রশ্নগুলি পার্স করার সাথে সাথে সেগুলি আবারও লেখা হয়। উদাহরণস্বরূপ ক্যোয়ারীগুলির প্রথমটির ফলাফল দ্বিতীয়টির মতো ঠিক একই ক্যোয়ারী ট্রিটিতে পার্স করা হচ্ছে - প্রান্তিকাগুলি তখন পিজিকে জানায় এটির সাথে যোগদানের বা পুনরায় অর্ডার দেওয়ার চেষ্টা করা উচিত কিনা।
ডেনিস ডি বার্নার্ডি

8

ঠিক আছে এখানে এর সেট থিয়োরি ভিউ:

আপনি যখন দুটি (বা আরও) টেবিলের নাম আলাদা করতে কমা ব্যবহার করেন তখন কারটিশিয়ান পণ্য ian 'বাম' টেবিলের প্রতিটি সারি ডান টেবিলের সাথে 'মিলিত' (কনটেটেটেড) হবে।

এখন আপনি যদি যেখানে ধারাটিতে কিছু লিখেন তবে এটি এই 'কনকেন্টেশন' তে একটি শর্ত রাখার মতো যা বলছে কোন সারিগুলিকে কোন সারি দিয়ে 'একত্রিত করতে হবে'।

এটি প্রকৃতপক্ষে সারিগুলিকে "যোগদান" করছে :) এবং তাই যুক্ত হওয়া কীওয়ার্ড যা আরও বেশি পঠনযোগ্য সিনট্যাক্স সরবরাহ করতে সহায়তা করে এবং আরও বোঝা যায় যে আপনি 'সাধারণ' কিছু সাধারণ মানের সাথে যুক্ত হতে চান। @ ডাস্টিন উপরে বর্ণিত কিসের অনুরূপ।

এখন, প্রতিটি ডিবিএমএস স্মার্ট অর্থাৎ এটি কার্টেসিয়ান পণ্য গণনা করে না এবং তারপরে ডেটা ফিল্টার আউট করে (অত্যন্ত অপব্যয়ী) বরং কোয়েরি কাঠামোর উপর ভিত্তি করে এটি করে। আমি কেবল এটিই ভাবতে পারি, যখন আপনি এটি 'যোগদান' করতে বলছেন এটি যোগদানের ক্রিয়াকলাপটিকে সুস্পষ্ট করার মতো এবং সম্ভবত কোডটি দ্রুত চালাতে সহায়তা করে (কতটা? আপনাকে এটির প্রোফাইল দিতে হবে এবং দেখতে হবে) তবে এতে কমা বিচ্ছিন্ন ক্ষেত্রে, সর্বোত্তম কৌশলটি 'চিত্রিত করতে' কিছুটা সময় প্রয়োজন। আমি ভুল হতে পারি, তবে আমি কীভাবে এটির কোড করব তা নিয়ে আমি শিক্ষিত অনুমান করছি ...


5

আমি মনে করি সেই ক্ষেত্রে JOIN বিবৃতি ব্যবহার করা ভাল।

ভবিষ্যতে, যদি এমন পরিস্থিতি দেখা দেয় যে অনুলিপি থেকে একজন জয়েন্ট থেকে একটি আউট জয়েন হিসাবে বিবৃতি পরিবর্তন করতে হয়, তবে দ্বিতীয় বিবৃতিটি করা এটি আরও সহজ হবে।


3

যে কোনও আরডিবিএমএস তাদের কার্যকর করার ক্ষেত্রে একই জিনিস তৈরি করতে চলেছে। এটি আরও পড়ার এবং ভাবপূর্ণ কিনা তা নীচে নেমে আসে।

JOIN ব্যবহার করুন যাতে এটি স্পষ্ট হয় কী মিলছে এবং আসল নির্বাচনটি কী, যেমন:

select name, deptname
from people p, departments d
where p.deptid = d.id and p.is_temp = 'Y'

বনাম

select name, deptname
from people p
    inner join departments d on p.deptid = d.id
where p.is_temp = 'Y'

পরবর্তী ঘটনাটি তাৎক্ষণিকভাবে পরিষ্কার করে দেয় যে কোনটি যুক্ত হওয়ার শর্ত, এবং কোনটি নির্বাচনের মানদণ্ড।


1

আমি কেবল একবারই দুটি ফলাফলটিকে অপটিমাইজেশনের বিভিন্ন সেটে দেখেছি এবং যদি মেমরিটি পরিবেশন করে তবে সত্যিই লোমশ ক্যোয়ারিতে এটি এমএস-এসকিএল 2 কে ছিল। সেই এক উদাহরণে * = দিয়ে ব্যবহৃত পুরানো ফর্মটি প্রায় 4x দ্রুত পারফরম্যান্সের ফলস্বরূপ। আমাদের মাইক্রোসফ্ট প্রযুক্তিবিদরা সহ কেউ কখনই এর কারণ ব্যাখ্যা করতে পারেনি। এমএস ছেলেরা এটিকে ভুল হিসাবে চিহ্নিত করেছে। আমি আর কখনও দেখিনি।

যেহেতু বেশিরভাগ আরডিবিএমএস পুরো কারটিশিয়ান না করার জন্য যথেষ্ট স্মার্ট, তাই আমি এটি ব্যবহার না করার কথা ভাবতে পারি তার সবচেয়ে বড় কারণ (এটি অবহেলিতও হয়) হ'ল আমি যে ৩০-৩৫ বছরের কম বয়সীদের সাথে কাজ করেছি তারা কখনই দেখেনি পুরানো ফর্ম আগে এবং তারা এটির মুখোমুখি হয়ে ভয়ানকভাবে হারিয়ে যায়।


অবশ্যই সেই বামে যোগদানের সিনট্যাক্সটি কখনই নির্ভরযোগ্যভাবে সঠিক ফলাফল দেয় নি (এসকিউএল সার্ভার 2000 এর জন্য বিওএল দেখুন) সুতরাং এটি দ্রুততর হলেও, আমি এটি প্রতিস্থাপন করতাম।
এইচএলজিইএম

আমি কখনই এর মুখোমুখি হই নি, এবং নক্ষত্রের সাথে অনুসন্ধান কখনও ভাল হয় না, আপনার কি উদাহরণ আছে?
বিল

-1

পুরানো স্টাইলটি অবচয় করা হয়েছে, আপনার এটি ব্যবহার করা উচিত নয়।

কোনটি ভাল বা না তা নিয়ে কোনও বিতর্কও হওয়া উচিত নয়। নতুন কোডটিতে পুরানো বাক্য গঠন ব্যবহার করা উচিত নয়।


আমি মনে করি যে এই উত্তরটি কেন অবহিত করা হয়েছিল এবং ব্যবহার করা উচিত নয় তা না বলে সত্যিই কিছু যুক্ত হয় না ।
রিমকো গ্রিলিচ

1
@ রেমকো গ্রিলিচ কেন এটি অবহেলা করা হয়েছে তা এখানে আলোচনার মধ্যে নেই। পুরানো বা নতুন সিনট্যাক্সটি ব্যবহার করবেন কিনা তা এখানে আলোচনার অধীনে। এরপরে একটি ভাল বা অন্যটি হ'ল মূট: আপনার পুরানো বাক্য গঠন ব্যবহার করা উচিত নয়। কেন প্রশ্ন অন্য আলোচনা হয়। (একটি যা 20 বছর আগে নিষ্পত্তি হয়েছে))
পিটার বি

-4

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


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