একটি জয়েন্ট শর্ত এবং একটি যেখানে শর্তের মধ্যে একটি মৃত্যুদন্ড কার্যকর?


17

এই দুটি উদাহরণ প্রশ্নের মধ্যে একটি পারফরম্যান্স পার্থক্য আছে?

প্রশ্ন 1:

select count(*)
from   table1 a
join   table2 b
on     b.key_col=a.key_col
where  b.tag = 'Y'

প্রশ্ন 2;

select count(*)
from   table1 a
join   table2 b
on     b.key_col=a.key_col
   and b.tag = 'Y'

লক্ষ করুন যে পার্থক্যটি কেবলমাত্র পরিপূরক শর্তের অবস্থান; প্রথমটি একটি WHEREধারা ব্যবহার করে এবং দ্বিতীয়টি শর্তটিতে শর্ত যুক্ত করে ON

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

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


9
এটি প্ল্যাটফর্ম নির্ভর, কারণ এটি নির্ভর করে যে আরডিবিএমএস অপটিমাইজার কীভাবে পার্সিং এবং অপ্টিমাইজেশানের সাথে ডিল করে।
ফিলি

8
এবং লিঙ্কযুক্ত প্রশ্নের উত্তরটি বেশ কয়েকটি ডাউনভোটের দাবিদার। এমনকি মাইএসকিউএল এর আদিম অপ্টিমাইজার বুঝতে পারে যে এই সাধারণ প্রশ্নগুলি সমতুল্য এবং "যেখানে সমস্ত দণ্ড সংযুক্ত হওয়ার পরে যেখানে ক্লজটি মূল্যায়ন করা হয়" কেবলমাত্র একটি যৌক্তিক স্তরে সত্য, বাস্তবায়নের ক্ষেত্রে নয়।
ypercubeᵀᴹ

1
সত্যই সদৃশ নয়; এই প্রশ্নটি এবং উত্তরগুলি "অন্তর্নিহিত" বনাম "সুস্পষ্ট" JOIN সিনট্যাক্সের সাথে তুলনা করছিল। আমি পরিপূরক যোগদানের শর্ত সম্পর্কে বিশেষত জিজ্ঞাসা করছি।
BellevueBob

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

উত্তর:


14

অধ্যায় 9 (পার্সার এবং অপ্টিমাইজার) অনুসারে, সাশা পাচেভ রচিত মাইএসকিউএল ইন্টার্নালিং বইয়ের পৃষ্ঠা 172

মাইএসকিউএল ইন্টার্নাল বোঝা

নীচের কাজগুলি হিসাবে কোয়েরির মূল্যায়ন এখানে রয়েছে:

  • সারণীগুলি থেকে রেকর্ডগুলি পুনরুদ্ধার করতে কোন কীগুলি ব্যবহার করা যেতে পারে তা নির্ধারণ করুন এবং প্রতিটি টেবিলের জন্য সেরাটি চয়ন করুন।
  • প্রতিটি টেবিলের জন্য, সিদ্ধান্ত নিন যে কোনও টেবিল স্ক্যান কোনও কীতে পড়া ভাল decide মূল মানটির সাথে মেলে এমন অনেকগুলি রেকর্ড থাকলে, কীটির সুবিধাগুলি হ্রাস হয় এবং টেবিল স্ক্যানটি দ্রুত হয়ে যায়।
  • যখন কোয়েরিতে একাধিক টেবিল উপস্থিত থাকবে তখন সারণিতে কোন সারণিতে যোগদান করতে হবে তা নির্ধারণ করুন।
  • ডেড কোড মুছে ফেলার জন্য যেখানে অধ্যায়গুলি পুনরায় লিখুন, অযৌক্তিক গণনা হ্রাস করতে এবং কীগুলি ব্যবহারের জন্য উন্মুক্ত করার জন্য যেখানেই সম্ভব সীমাবদ্ধতাগুলি পরিবর্তন করুন।
  • যোগদান থেকে অব্যবহৃত টেবিলগুলি বাদ দিন।
  • কীগুলি ORDER BYএবং এর জন্য ব্যবহার করা যায় কিনা তা নির্ধারণ করুন GROUP BY
  • সাবকিউরিগুলি সহজতর করার চেষ্টা করুন পাশাপাশি তাদের ফলাফলগুলি কতটা ক্যাশে করা যায় তা নির্ধারণ করুন।
  • ভিউগুলি মার্জ করুন (ম্যাক্রো হিসাবে দেখার রেফারেন্সটি প্রসারিত করুন)

একই পৃষ্ঠায় এটি নিম্নলিখিত বলে:

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

উপসংহার

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

আমি এই উদ্বিগ্নতা সম্পর্কে আগে লিখেছি

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

@ ফিলের মন্তব্য আমাকে এই উত্তরটি কীভাবে পোস্ট করবেন তা দেখতে সহায়তা করে (@ ফিলের মন্তব্যের জন্য +1)

@ ইয়ারকিউবের মন্তব্য (এটির জন্যও +1) আমার পোস্টের একটি কমপ্যাক্ট সংস্করণ কারণ মাইএসকিউএল এর কোয়েরি অপটিমাইজার আদিম। দুর্ভাগ্যক্রমে, এটি হওয়া উচিত কারণ এটি বাইরের স্টোরেজ ইঞ্জিনগুলির সাথে ডিল করে।

উপসংহার

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

  • সারি গণনা
  • কী নির্বাচন করা
  • বিরতিতে ফলাফল সেট ম্যাসেজ
  • ওহ হ্যাঁ, আসল যোগদান করুন

কোয়েরিকে পুনরায় (রিফ্যাক্টরিং) লিখে আপনার মৃত্যুদণ্ডের আদেশটি জোর করে নিতে হবে

আপনার দেওয়া প্রথম প্রশ্নটি এখানে

select count(*)
from   table1 a
join   table2 b
on     b.key_col=a.key_col
where  b.tag = 'Y';

প্রথমে WHERE মূল্যায়নের জন্য এটি পুনরায় লেখার চেষ্টা করুন

select count(*)
from   table1 a
join   (select key_col from table2 where tag='Y') b
on     b.key_col=a.key_col;

এটি স্পষ্টভাবে পরিকল্পনার পরিবর্তন করবে। এটি আরও ভাল বা খারাপ ফলাফল তৈরি করতে পারে।

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

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


2
বিশদ মাইএসকিউএল-নির্দিষ্ট তথ্যের জন্য এবং বিশেষত "এপিলোগ" এবং "উপসংহার" এর মধ্যে পার্থক্য শেখার জন্য আমাকে ট্রিক করার জন্য +1!
BellevueBob

আমার পোস্টে, এপিলোগটি একটি উপ-উপসংহার।
রোল্যান্ডোমাইএসকিউএলডিবিএ

6
@Rolando: আপনি একটি যোগ করতে পারেন ভবিষ্যত ফলাফল সর্বশেষ মধ্যে optimizers MariaDB (5.3 এবং 5.5) সংস্করণের উপর এবং সম্প্রতি মুক্তি প্রধান মাইএসকিউএল (5.6) সংস্করণ উন্নতি সম্পর্কে। যা কিছু পুনর্লিখনকে অপ্রয়োজনীয় করে তুলতে পারে।
ypercubeᵀᴹ

1

ওরাকল-এর জন্য, যেহেতু মাইএসকিউএলটির দীর্ঘ বিবরণ ছিল, তাই আমরা অপটিমাইজারকে লাভবান করার দুটি উচ্চ স্তরের উপায় পেয়েছি।

প্রথমটি হ'ল বিলেড অপটিমাইজেশন (বা আরবিও)। ওরাকল-এ 15-সেট-ইন-স্টোন বিধি রয়েছে যা প্রতিটি ক্যোয়ারী এটি একটি সেট অর্ডার অনুসরণ করার চেষ্টাকে বিশ্লেষণ করে। যদি এটি নিয়ম 1 থেকে একটি অনুকূলিত ক্যোয়ারী তৈরি করতে না পারে তবে এটি নিয়ম 15 এ আঘাত না করা অবধি নিয়ম 2 এবং পরবর্তী দিকে এগিয়ে যাবে।

আরও তথ্যের জন্য: https://docs.oracle.com/cd/B10500_01/server.920/a96533/rbo.htm

এগুলি 11.1 এবং এর নীচে থেকে ওরাকল আরডিবিএমএস কার্নেলগুলিকে প্রভাবিত করে যা ব্যয় ভিত্তিক অপ্টিমাইজারে (ওরফে সিবিও) রূপান্তরিত হয়নি। ওরাকল ১১.২ এবং তারপরে সিবিও অপ্টিমাইজারের প্রয়োজন, তবে ব্যবহারকারী চাইলে নির্দিষ্ট এসকিএল আইডিগুলি পুরানো আরবিও পদ্ধতিতে অনুকূল করতে বাধ্য করতে পারে।

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

আরও তথ্যের জন্য: https://oracle-base.com/articles/misc/cost-based-optimizer- এবং- ডেটাবেস-স্ট্যাটিস্টিক্স

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


1

আপনার যদি দুটি প্রশ্ন থাকে এবং আপনি যদি মনে করেন যে এগুলি সমতুল্য হয় তবে নিম্নলিখিতগুলি ঘটতে পারে:

  1. উভয় প্রশ্নের একই কার্যনির্বাহী পরিকল্পনা রয়েছে। এটি ঠিক আছে এবং আমরা এটি প্রত্যাশা করি। আসুন আশা করি এটি ক্যোয়ারির জন্য সর্বোত্তম বাস্তবায়ন পরিকল্পনা।
  2. বিভিন্ন কার্যকর করার পরিকল্পনা রয়েছে। আমাদের এখানে দুটি সাব-কেস রয়েছে।

    ২.১ প্রশ্নের বিভিন্ন কার্যকরকরণের পরিকল্পনা রয়েছে তবে উভয় পরিকল্পনা সমানভাবে কার্যকর করে perform এটাও ঠিক আছে। সমতুল্য প্রশ্নের জন্য একই পরিকল্পনা উত্পন্ন করতে হবে এমন কোন প্রয়োজন নেই। তবে পারফরম্যান্স সমান হওয়া উচিত। এবং আবার আমরা আশা করি এটি সর্বোত্তম সম্ভব।

    ২.২ অনুসন্ধানগুলির বিভিন্ন কার্যকরকরণ পরিকল্পনা রয়েছে এবং একটি পরিকল্পনা অন্যটির চেয়ে ভাল। আবার আমাদের সাব-কেসস রয়েছে:

    ২.২.১ পরিকল্পনাগুলি আলাদা কারণ প্রশ্নগুলি সমতুল্য নয়। সুতরাং তারা সত্যই সমতুল্য কিনা তা সাবধানে পরীক্ষা করে দেখুন। আপনার ক্ষেত্রে তারা সত্যই সমতুল্য।

    ২.২.২ পরিকল্পনাগুলি পৃথক হলেও প্রশ্নের সমতুল্য। এর অর্থ অপটিমাইজার যথেষ্ট পরিপক্ক নয়। নিখুঁত অপ্টিমাইজার সহ একটি নিখুঁত বিশ্বে এটি হওয়া উচিত নয়। সুতরাং হ্যাঁ, এটি প্ল্যাটফর্ম নির্ভর why

    ২.২.৩ পরিকল্পনাগুলি পৃথক, অনুসন্ধান সমান, ডাটাবেস সফ্টওয়্যারটিতে একটি বাগ রয়েছে।

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