সাবকিউরিজ বনাম যোগ দেয়


158

আমি অন্য একটি কোম্পানির কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত একটি অ্যাপ্লিকেশনটির একটি ধীর অংশটি রিফ্যাক্টর করেছিলাম যেমন:

WHERE id IN (SELECT id FROM ...)

রিফ্যাক্টর ক্যোয়ারী প্রায় 100x দ্রুত চলে। (~ ৫০ সেকেন্ড থেকে ~ ০.০) আমি উন্নতির প্রত্যাশা করেছি, তবে কেন এটি এত কঠোর ছিল কেউ ব্যাখ্যা করতে পারেন? যেখানে ধারাটিতে ব্যবহৃত কলামগুলি সমস্ত সূচিযুক্ত হয়েছিল। এসকিউএল কি প্রতি সারি বা কোনও কিছুর জন্য ধারাটিতে কোয়েরি সম্পাদন করে?

আপডেট - ফলাফল ব্যাখ্যা করুন:

পার্থক্যটি "যেখানে আইডি ইন ()" ক্যোয়ারির দ্বিতীয় অংশে -

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where

যোগদানের সাথে 1 ইনডেক্সড সারি বনাম:

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index


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

@ সিংহুমিলিকো এটি কোনও উন্নতি নয়, এটি কোনও তফাত নয়, এটি লেখক যা লিখেছেন তার বিপরীত এবং কোড শৈলীর জন্য এ জাতীয় সম্পাদনা অনুচিত। কোডে আমি কখন সম্পাদনা করব?
ফিলিপ্সি

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

উত্তর:


160

একটি "সম্পর্কিত সাবকোয়ারি" (যেমন, যেখানে শর্তটি থাকা ক্যোয়ারীর সারিগুলি থেকে প্রাপ্ত মানের উপর নির্ভর করে) প্রতিটি সারির জন্য একবার সম্পাদন করবে। একটি অ-সম্পর্কযুক্ত সাবকোয়ারি (একটি যেখানে শর্তটি অন্তর্ভুক্ত থাকা ক্যোয়ারীর চেয়ে পৃথক) প্রথম দিকে একবার সম্পাদন করবে। এসকিউএল ইঞ্জিন স্বয়ংক্রিয়ভাবে এই পার্থক্য তৈরি করে।

তবে, হ্যাঁ, ব্যাখ্যা-পরিকল্পনা আপনাকে নোংরা বিবরণ দেবে।


3
দয়া করে মনে রাখবেন যে এর DEPENDENT SUBQUERYঅর্থ হ'ল "সম্পর্কযুক্ত সাবকোয়ারি" হিসাবে একই জিনিস thing
টিমো

38

আপনি প্রতি সারিতে একবার সাবকোয়ারি চালাচ্ছেন যেখানে যোগসূত্রটি সূচকগুলিতে ঘটে।


5
আমি এটা সত্য মনে করি না। এসকিউএল ইঞ্জিনটি কেবল একবার সাবকোয়ারি চালানো উচিত এবং ফলাফলটিকে একটি তালিকা হিসাবে ব্যবহার করা উচিত।
dacracot

8
এটি নির্ভর করে - যদি সাবকোয়ারিটি কোনওভাবে বাহ্যিক ক্যোয়ারির সাথে সম্পর্কিত হয় (এর ডেটা ব্যবহার করে) তবে এটি প্রতিটি সারি দিয়ে কার্যকর করা হয়।
qbeuek

4
এটি সম্ভবত এই ক্ষেত্রে সত্য, তবে এটি সাধারণভাবে সত্য নয়।
অ্যামি বি

1
ওপি এর EXPLAINবলছেন DEPENDENT SUBQUERY, যা এই আচরণ এর clearest সূচক।
টিমো

16

এখানে মাইএসকিউএল 6.0-এ সাব-কোয়েরিগুলি কীভাবে মূল্যায়ন করা হয় তার একটি উদাহরণ ।

নতুন অপ্টিমাইজার এই ধরণের সাবকিউরিগুলিকে যোগদানের সাথে রূপান্তর করবে।


এটি মাইএসকিউএল 6.0 উন্নত অপ্টিমাইজারের একটি দুর্দান্ত নিবন্ধ, ধন্যবাদ
ফায়ার ক্র

7

প্রতিটি সংস্করণে ব্যাখ্যা-পরিকল্পনাটি চালান, এটি আপনাকে বলবে।


6

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

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


4

প্রতিটি প্রশ্নের জন্য ক্যোয়ারী পরিকল্পনাটি দেখুন।

যেখানে ইন এবং জয়েন সাধারণত একই বাস্তবায়ন পরিকল্পনা ব্যবহার করে প্রয়োগ করা যেতে পারে, তাই সাধারণত তাদের মধ্যে পরিবর্তন থেকে শূন্যগতির আপ হয়।


3
হাহাহা, আমি <3 বর্গক্ষেত্র যে ডাউন-ভোটটি স্ক্রাব করে কারণ তারা ক্যোয়ারী পরিকল্পনা কীভাবে পড়তে জানে না।
অ্যামি বি

4

অপ্টিমাইজার খুব ভাল কাজ করেনি। সাধারণত তারা কোনও পার্থক্য ছাড়াই রূপান্তরিত হতে পারে এবং অপ্টিমাইজার এটি করতে পারে।


4

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


4

এই প্রশ্নটি কিছুটা সাধারণ, সুতরাং এখানে একটি সাধারণ উত্তর:

মূলত, মাইএসকিউএলকে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে সাজতে হয়।

এটা কর:

প্রতিটি প্রশ্নের উপর একটি ব্যাখ্যা চালান (জয়েন এক, তারপরে সাবকিউরিড একটি), এবং ফলাফলগুলি এখানে পোস্ট করুন।

আমি মনে করি যে এই প্রশ্নগুলির মাইএসকিউএল এর ব্যাখ্যার মধ্যে পার্থক্যটি দেখা প্রত্যেকের জন্য একটি শেখার অভিজ্ঞতা হবে।


4

যেখানে সাবকিউরিতে প্রতিটি ফিরে আসা সারির জন্য 1 টি ক্যোয়ারী চালাতে হয়। অভ্যন্তরীণ যোগদানের জন্য কেবল 1 টি ক্যোয়ারী চালাতে হবে।


3

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

অবশ্যই বিশদ বিবরণ ছাড়া একটি অনুমান তবে এটি সাধারণ পরিস্থিতি।


2

একটি subquery সঙ্গে, আপনি প্রতিটি ফলাফলের জন্য 2 য় SELECT পুনরায় কার্যকর করতে হবে, এবং প্রতিটি সম্পাদন সাধারণত 1 সারি প্রদান।

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


2

এটি আইএন ক্লজের মতো এত সাব-কোয়েরি নয়, যদিও অন্তত ওরাকল এর এসকিউএল ইঞ্জিনের ভিত্তিতে যোগদান করে এবং খুব দ্রুত চালিত হয়।


1
সত্যিই অন্তর্নিহিত খারাপ যেখানে না।
শপন

2

রেফারেন্স ম্যানুয়াল থেকে নেওয়া ( 14.2.10.11 পুনরায় লেখার সাবকিউরিজগুলি যোগদান হিসাবে ):

একটি বাম [আউটার] যোগদানকারী একটি সমতুল্য subquery চেয়ে দ্রুত হতে পারে কারণ সার্ভার এটি আরও ভাল করতে সক্ষম হতে পারে - এটি মাইএসকিউএল সার্ভারের সাথে নির্দিষ্ট নয় fact

সুতরাং সাবকিউরিজগুলি বাম [আউটার] যোগগুলির চেয়ে ধীর হতে পারে।

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