কোনটি উত্তম: অনেকগুলি শর্তে যোগ দেয় বা অনেকগুলি শর্ত কোথায়?


13

আমি দুটি প্রশ্নের তুলনা করার চেষ্টা করছি:

প্রশ্ন 1:

SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c  AND tableA.d=tableB.d  AND tableA.e=tableB.e 

প্রশ্ন 2:

SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c  AND tableA.d=tableB.d  
WHERE tableA.e=tableB.e 

আমি কি ঠিক বলতে পারি যে এই দুটি প্রশ্নের একই ফলাফল রয়েছে?

আরও বলা যায় যে, প্রথম ক্যোয়ারী একটি বড় টেবিল তৈরি করে যার জন্য আরও বড় WHEREশর্ত করতে হবে; যদিও দ্বিতীয় ক্ষেত্রে আমাদের একটি ছোট্ট নির্মান টেবিল রয়েছে যেখানে WHEREসরলটি প্রয়োগ করা হয়।

ফলাফলগুলি একই বলে ধরে নিচ্ছি, কোন কোয়েরিকে পছন্দ করা উচিত? একটি সুস্পষ্ট পারফরম্যান্স সমস্যা আছে?


3
না, আপনি ঠিক তা বলছেন না। এটি যদি এমন হয় তবে এটির INNER JOINসাথে LEFT JOINবিভিন্ন ফলাফল ফিরে আসবে। মূলত, WHEREআপনার দ্বিতীয় ক্যোয়ারীতে আপনি যে শর্তগুলি যুক্ত করেছেন তা আপনাকে রূপান্তরিত JOINকরছেINNER JOIN
লামাক

আহ, ঠিক আছে. আপনি যা বলেন আমি তা অনুসরণ করি। আমি সম্পাদনা যদি সম্পাদন করতে INNER JOINপারফরমেন্সে আমার প্রশ্নগুলি বৈধ থাকবে?
জেফ

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

@ টাইপকিউব ঠিক আছে, আমি সেই অবস্থাটি মিস করেছি।
লামাক

উত্তর:


10

যদি আমরা বিবেচনা করি যে আপনি INNER JOINপরিবর্তে LEFT JOIN(যা আপনার উদ্দেশ্য হিসাবে প্রতীয়মান হয়) ব্যবহার করেন তবে এই দুটি প্রশ্নের ক্রিয়াকলাপ সমতুল্য। ক্যোয়ারী অপ্টিমাইজারগুলি আপনার WHEREক্লজ এবং আপনার FROMদফার মানদণ্ডগুলি পর্যালোচনা ও মূল্যায়ন করবে এবং সর্বাধিক দক্ষ প্রয়োগের পরিকল্পনায় পৌঁছানোর জন্য ক্যোয়ারী পরিকল্পনা তৈরি করার সময় এই সমস্ত বিষয় বিবেচনা করবে। যদি আমরা EXPLAINউভয় বিবৃতিতে একটি করে, আমরা একই ফলাফল পেতে:

প্রশ্ন 1 :

EXPLAIN
SELECT 
  tableA.ColA
  ,tableA.ColB
  ,tableA.ColC
  ,tableA.ColD
  ,tableA.ColE
FROM tableA
  JOIN tableB ON tableA.ColA=tableB.ColA
WHERE 
  tableA.ColB=tableB.ColB 
  AND tableA.ColC=tableB.ColC 
  AND tableA.ColD=tableB.ColD  
  AND tableA.ColE=tableB.ColE

[ফলাফল] :

| ID | SELECT_TYPE |  TABLE | TYPE | POSSIBLE_KEYS |    KEY | KEY_LEN |    REF | ROWS |                          EXTRA |
------------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | tableA |  ALL |        (null) | (null) |  (null) | (null) |    1 |                                |
|  1 |      SIMPLE | tableB |  ALL |        (null) | (null) |  (null) | (null) |    1 | Using where; Using join buffer |

প্রশ্ন 2 :

EXPLAIN
SELECT 
  tableA.ColA
  ,tableA.ColB
  ,tableA.ColC
  ,tableA.ColD
  ,tableA.ColE
FROM tableA
  JOIN tableB ON tableA.ColA=tableB.ColA
  AND tableA.ColB=tableB.ColB 
  AND tableA.ColC=tableB.ColC 
  AND tableA.ColD=tableB.ColD  
WHERE
  tableA.ColE=tableB.ColE

[ফলাফল] :

| ID | SELECT_TYPE |  TABLE | TYPE | POSSIBLE_KEYS |    KEY | KEY_LEN |    REF | ROWS |                          EXTRA |
------------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | tableA |  ALL |        (null) | (null) |  (null) | (null) |    1 |                                |
|  1 |      SIMPLE | tableB |  ALL |        (null) | (null) |  (null) | (null) |    1 | Using where; Using join buffer |

আপনি নিম্নলিখিত লিঙ্কগুলির সাথে পুরো বিশদটি পর্যালোচনা করতে পারেন। আমি একটি এসকিউএল ২০০৮ উদাহরণও তৈরি করেছি যাতে আপনি দুটি ইঞ্জিন কীভাবে কাজ করেন তা তুলনা করতে পারেন (যা একই)

মাইএসকিউএল ক্যোয়ারির উদাহরণ

এসকিউএল ২০০৮ ক্যোয়ারের উদাহরণ (নিশ্চিত করুন যে আপনি উভয় ফলাফলের জন্য 'এক্সিকিউশন প্ল্যান' দেখুন)


আপনার বিস্তারিত সমাধানের জন্য আপনাকে ধন্যবাদ। আমি INNER JOINপরিবর্তে চেষ্টা করেছিলাম LEFT JOINএবং আমি দশমীতে একই আউটপুট পাই। আমি মনে করি আমি জানি কেন আমি একই আউটপুট পাই তবে কেন আরও INNER JOINভাল পারফরম্যান্স হবে?
জিওফ

4
হিসাবে LEFT JOINএকটি বাইরের যোগদানের হয়, এটি সেট পূর্ণ রিটার্ন পাশ ডেটা সেট সীমিত করতে পারে না এবং (এই মামলা, TableA মধ্যে) যে টেবিল থেকে সব সারি পুনরুদ্ধার করতে চেষ্টা করবে। আপনি যদি ব্যবহার করেন তবে INNER JOINএটি উভয় টেবিলে সেই মানদণ্ডটি উপকার করতে পারে এবং ডেটা সেটকে সীমাবদ্ধ করে, এইভাবে একটি দ্রুত রিটার্ন সরবরাহ করে।
মাইক ফাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.