সুস্পষ্ট বনাম অন্তর্নিহিত এসকিউএল যোগ দেয়


399

সুস্পষ্ট বনাম অন্তর্ভুক্ত অভ্যন্তরীণ যোগদানের কোনও দক্ষতার পার্থক্য রয়েছে কি? উদাহরণ স্বরূপ:

SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;

বনাম

SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;

11
ভাল প্রশ্ন. আমি কৌতূহলী যে কেন স্পষ্টভাবে যোগদানটি মোটেই ব্যবহৃত হয়। এটি ছাড়া সব প্রশ্ন করা কি সম্ভব নয়?
অ্যান্ড্রু

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

@ অ্যান্ড্রু আমার প্রশ্নটি ছিল আসলে অন্তর্নিহিত যোগদান "হ্যাক" এর একটি রূপ ছিল (যেমন "একাধিক টেবিলের সাথে জড়িত একটি জিজ্ঞাসা,
যোগটি

3
এগুলি পৃথক, অন্তর্নিহিত যোগদান একবারে একবারে নাল মানগুলির সাথে আচরণ করার সময় আপনাকে অবাক করে দেবে; সুস্পষ্ট যোগদানের ব্যবহার করুন এবং "যখন কিছুই পরিবর্তন হয়নি!"
ব্ল্যাকটাইগারএক্স

1
এখানে কোন পার্থক্য নেই. ,হয় CROSS JOINঢিলেঢালা বাঁধাই & সঙ্গে INNER JOINহয় CROSS JOINসঙ্গে ONমত WHEREকিন্তু বাঁধাই কঠিন। মৃত্যুদন্ড কার্যকর করার জন্য কী কী গুরুত্বপূর্ণ তা হল ডিবিএমএস কীভাবে প্রশ্নগুলি অনুকূল করে।
ফিলিপ্সি

উত্তর:


132

পারফরম্যান্স অনুযায়ী, এগুলি হুবহু একই (অন্তত এসকিউএল সার্ভারে)।

পিএস: সাবধান থাকুন যে IMPLICIT OUTER JOINসিনট্যাক্সটি এসকিউএল সার্ভার ২০০৫ সাল থেকে অবচয় করা হয়েছে (( IMPLICIT INNER JOINপ্রশ্নটিতে ব্যবহৃত বাক্য গঠন এখনও সমর্থিত)

"ওল্ড স্টাইল" জিন সিনট্যাক্সের অবমূল্যায়ন: কেবলমাত্র একটি আংশিক বিষয়


4
@lomaxx শুধু স্বচ্ছতা দোহাই জন্য, আপনি উল্লেখ করতে পারে যা প্রশ্নে 2 সিনট্যাক্স অবচিত?
জে Wynia

8
আপনি কি সমর্থনকারী ডকুমেন্টেশন সরবরাহ করতে পারেন? এটি একাধিক স্তরে ভুল শোনাচ্ছে।
NotMe

21
আপনি কীভাবে এসকিউএল স্ট্যান্ডার্ডকে হ্রাস করবেন?
ডেভিড ক্র্যাশওয়া

7
@ ডেভিড ক্রেনশা, অন্তর্নিহিত যোগদানটি এখন আর স্ট্যান্ডার্ডে নেই এবং 18 বছর ধরে হয়নি।
এইচএলজিইএম

11
'অভ্যন্তরীণ' বা 'ক্রস' প্রকারের তথাকথিত "অন্তর্নিহিত যোগ দেয়" স্ট্যান্ডার্ডে থেকে যায়। SQL সার্ভার 'পুরানো ধাঁচের "বিনয়ী হয় বাইরের সিনট্যাক্স যোগদানের (অর্থাত *=এবং =*) আছে যা কখনোই স্ট্যান্ডার্ড হয়েছে।
onedaywhen

129

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


4
আমি সম্পূর্ণরূপে একমত, তবে এটি এক প্রকারের অফ-টপিক। ওপি দক্ষতা সম্পর্কে জিজ্ঞাসা।
ভিলাসভ

56

মাইএসকিউএল 5.1.51 এ, উভয় প্রশ্নেরই একইরূপ কার্যকর পরিকল্পনা রয়েছে:

mysql> explain select * from table1 a inner join table2 b on a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref          | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
|  1 | SIMPLE      | b     | ALL  | PRIMARY       | NULL | NULL    | NULL         |  986 |       |
|  1 | SIMPLE      | a     | ref  | pid           | pid  | 4       | schema.b.pid |   70 |       |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.02 sec)

mysql> explain select * from table1 a, table2 b where a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref          | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
|  1 | SIMPLE      | b     | ALL  | PRIMARY       | NULL | NULL    | NULL         |  986 |       |
|  1 | SIMPLE      | a     | ref  | pid           | pid  | 4       | schema.b.pid |   70 |       |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.00 sec)

table1166208 সারি রয়েছে; table2প্রায় 1000 সারি রয়েছে।

এটি খুব সাধারণ একটি ঘটনা; এটি কোনও উপায়ে প্রমাণ করে না যে কোয়েরি অপ্টিমাইজার বিভ্রান্ত হবে না এবং আরও জটিল ক্ষেত্রে বিভিন্ন পরিকল্পনা তৈরি করবে না।


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি সঠিক, পরিকল্পনাটি একই (বা বড় স্টেটমেন্টের সাথে ঘনিষ্ঠ) তবে রেকর্ডের পরিমাণ কঠোর হবে, সুতরাং পারফরম্যান্সে পার্থক্য সৃষ্টি করবে।
সোভিয়েতফ্রন্টিয়ার

37

দ্বিতীয় বাক্য গঠনটিতে ক্রস জয়েনের অবাঞ্ছিত সম্ভাবনা রয়েছে: আপনি যেখানে শর্তটি সম্পর্কিত না করে FROM অংশে টেবিল যুক্ত করতে পারেন। এটি ক্ষতিকারক হিসাবে বিবেচিত হয়।


যদি ধারাটিতে থাকা টেবিলের নামগুলি যেখানে ধারাটিতে ব্যবহৃত টেবিলগুলি থেকে উত্পন্ন হয়?
Jus12

আপনি সুস্পষ্ট জিন সিনট্যাক্সের সাথে ক্রস জয়েনও করতে পারেন (( স্ট্যাকওভারফ্লো . com/ a/ 44438026 / 929164 ) আপনি সম্ভবত বোঝাতে চেয়েছিলেন যে এটি কম কঠোর, সুতরাং ব্যবহারকারী ত্রুটির প্রবণতা বেশি।
ড্যানিয়েল দুবভস্কি

15

আপনি যে প্রথম উত্তর দিয়েছেন তা এএনএসআই জোড় সিনট্যাক্স হিসাবে পরিচিত যা ব্যবহার করে, অন্যটি বৈধ এবং কোনও রিলেশনাল ডাটাবেসে কাজ করবে।

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


5

পারফরম্যান্স অনুসারে, তারা হুবহু একই (কমপক্ষে এসকিউএল সার্ভারে) তবে তারা জেনে রাখুন যে তারা এই যোগদানের বাক্য গঠনটিকে অবমূল্যায়ন করছে এবং এটি বক্সের বাইরে স্কুয়েল সার্ভার ২০০5 দ্বারা সমর্থিত নয়।

আমি মনে করি আপনি অবহেলিত * = এবং = * অপারেটর বনাম "বহিরাগত যোগদান" সম্পর্কে ভাবছেন think

আমি এখনই প্রদত্ত দুটি ফর্ম্যাটটি পরীক্ষা করেছি এবং তারা এসকিউএল সার্ভার ২০০৮ ডাটাবেসে সঠিকভাবে কাজ করে। আমার ক্ষেত্রে তারা অভিন্ন বাস্তবায়ন পরিকল্পনা পেয়েছিল, তবে আমি আত্মবিশ্বাসের সাথে বলতে পারি না যে এটি সর্বদা সত্য হবে।


5

@ লমাএক্সএক্স: কেবল স্পষ্ট করে বলার জন্য, আমি বেশ নিশ্চিত যে উপরের দুটি বাক্য গঠন এসকিউএল সার্ভার ২০০৫ দ্বারা সমর্থিত। নীচের বাক্য গঠনটি অবশ্য সমর্থিত নয়

select a.*, b.*  
from table a, table b  
where a.id *= b.id;

বিশেষত, বাহ্যিক জোড় (* =) সমর্থিত নয়।


2
সত্যি বলতে গেলে আমি এটি এসকিউএল সার্ভার 2000 এও ব্যবহার করব না, * = বাক্য গঠন প্রায়শই ভুল উত্তর দেয়। কখনও কখনও এটি ক্রস যোগদান হিসাবে এটি ব্যাখ্যা করে।
এইচএলজিইএম

2

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

আপনি কোন ডেটাবেস ব্যবহার করছেন তা নির্দিষ্ট করেননি, তবে সম্ভাব্যতাটি এসকিউএল সার্ভার বা মাইএসকিউএলকে বোঝায় যেখানে সেখানে এটির কোনও তাত্পর্য নেই।


1
লে, আপনি অন্তর্নিহিত যোগদানের মধ্যেও ইঙ্গিতগুলি ব্যবহার করতে পারেন।
স্কয়ারকোগ

1
ওরাকলে এটি কার্যকরভাবে কার্যকরভাবে কার্যকর করার পরিকল্পনাকে প্রভাবিত করতে যোগদানের ক্রমের পক্ষে অত্যন্ত বিরল। ব্যাখ্যার জন্য জোনাথন লুইসের এই নিবন্ধটি দেখুন ।
জন হেলার

1

লে ক্যালডওয়েল যেমন বলেছে, একই এসকিউএল স্টেটমেন্টের মতো কার্যকরীভাবে দেখতে দেখতে কোয়েরি অপ্টিমাইজার বিভিন্ন ক্যোয়ারী পরিকল্পনা তৈরি করতে পারে produce এ সম্পর্কে আরও পড়ার জন্য, নীচের দুটি ব্লগ পোস্টগুলি দেখুন: -

ওরাকল অপটিমাইজার টিম থেকে একটি পোস্টিং

"স্ট্রাকচার্ড ডেটা" ব্লগ থেকে অন্য পোস্টিং

আমি আশা করি আপনি এটি আকর্ষণীয় পাবেন।


মাইক, তারা যে পার্থক্যের কথা বলছেন তা হ'ল আপনার অবশ্যই নিশ্চিত হওয়া দরকার যে আপনি যদি একটি স্পষ্ট যোগদানের নির্দিষ্ট করেন তবে আপনি যোগদানের শর্তটি ফিল্টারকে নয়, যোগ দেওয়ার জন্য নির্দিষ্ট করেন । আপনি লক্ষ করবেন যে শব্দার্থগতভাবে সঠিক প্রশ্নের জন্য, এক্সিকিউট পরিকল্পনাটি একই is
স্কয়ারকোগ

1

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


0

মূলত, দুজনের মধ্যে পার্থক্যটি হ'ল একটি পুরানো উপায়ে লেখা হয়, অন্যটি আধুনিক পদ্ধতিতে লেখা হয়। ব্যক্তিগতভাবে, আমি অভ্যন্তরীণ, বাম, বাইরের, ডান সংজ্ঞা ব্যবহার করে আধুনিক স্ক্রিপ্টটি পছন্দ করি কারণ তারা আরও ব্যাখ্যাযোগ্য এবং কোডটি আরও পাঠযোগ্য able

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

SELECT * 
FROM table a, table b
WHERE a.id = b.id (+);

উপরেরটি কীভাবে নীচের বিপরীতে লিখিতভাবে বাম জোড় লেখা হয় তা পুরানো উপায়:

SELECT * 
FROM table a 
LEFT JOIN table b ON a.id = b.id;

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

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


-1

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


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