আমার একটি কেস রয়েছে যেখানে একটি যোগদান বা আইএন ব্যবহার করে আমাকে সঠিক ফলাফল দেবে ... সাধারণত কোনটি ভালভাবে সম্পাদন করে এবং কেন? আপনি কোন ডাটাবেস সার্ভারটি চালাচ্ছেন তার উপর এটি কতটা নির্ভর করে? (এফওয়াইআই আমি এমএসএসকিউএল ব্যবহার করছি)
আমার একটি কেস রয়েছে যেখানে একটি যোগদান বা আইএন ব্যবহার করে আমাকে সঠিক ফলাফল দেবে ... সাধারণত কোনটি ভালভাবে সম্পাদন করে এবং কেন? আপনি কোন ডাটাবেস সার্ভারটি চালাচ্ছেন তার উপর এটি কতটা নির্ভর করে? (এফওয়াইআই আমি এমএসএসকিউএল ব্যবহার করছি)
উত্তর:
সাধারণত বলা হয়, IN
এবং JOIN
বিভিন্ন ক্যোয়ারী যা বিভিন্ন ফলাফল দিতে পারে।
SELECT a.*
FROM a
JOIN b
ON a.col = b.col
হিসাবে একই হয় না
SELECT a.*
FROM a
WHERE col IN
(
SELECT col
FROM b
)
, যদি না b.col
অনন্য হয়।
তবে এটি প্রথম প্রশ্নের জন্য প্রতিশব্দ:
SELECT a.*
FROM a
JOIN (
SELECT DISTINCT col
FROM b
)
ON b.col = a.col
যোগদানের কলামটি যদি এইরূপে UNIQUE
চিহ্নিত থাকে তবে এই দুটি প্রশ্নেরই একই পরিকল্পনা পাওয়া যায় SQL Server
।
যদি তা না হয়, তাহলে IN
দ্রুত চেয়ে JOIN
উপর DISTINCT
।
পারফরম্যান্স বিশদের জন্য আমার ব্লগে এই নিবন্ধটি দেখুন:
IN
বোঝা যাচ্ছে DISTINCT
। SQL Server
এটি লক্ষ্য করার জন্য যথেষ্ট স্মার্ট, এবং উভয় প্রশ্নের জন্য একই পরিকল্পনা তৈরি করবে। অন্যরা কীভাবে RDBMS
আচরণ করবে তা নিশ্চিত নয় ।
মজার আপনি উল্লেখ যে, আমি এই বিষয়ে একটি ব্লগ পোস্ট করেছি।
দেখুন ওরাকল বনাম মাইএসকিউএল SQL সার্ভার বনাম: সমষ্টি বনাম যোগদান করেছে
সংক্ষিপ্ত উত্তর: আপনাকে এটি পরীক্ষা করতে হবে এবং স্বতন্ত্র ডাটাবেসগুলি অনেক বেশি পরিবর্তিত হয়।
এটি বলা বাহুল্য শক্ত - কোনটি আরও ভালভাবে কাজ করে তা সত্যভাবে খুঁজে বের করার জন্য আপনাকে মৃত্যুদন্ড কার্যকর করার সময় প্রকৃতপক্ষে প্রোফাইল তৈরি করতে হবে।
থাম্বের একটি সাধারণ নিয়ম হিসাবে, আমি মনে করি যদি আপনার বিদেশী কী কলামগুলিতে সূচকগুলি থাকে এবং আপনি যদি কেবল (বা বেশিরভাগ) অভ্যন্তরীণ শর্তাদি ব্যবহার করেন তবে জিন কিছুটা দ্রুত হবে।
তবে আপনি আউট জয়েন ব্যবহার শুরু করার সাথে সাথে, বা যদি আপনার কাছে বিদেশী কী সূচকগুলি না থেকে থাকে তবে IN দ্রুততর হতে পারে।
আঙ্গুরের ছিরড়া
যৌক্তিক পার্থক্যের উপর একটি আকর্ষণীয় লিখনআপ : এসকিউএল সার্ভার: বনাম উপস্থিত বনাম উপস্থিতি - যৌক্তিক পার্থক্য
আমি দৃ sure়ভাবে নিশ্চিত যে সম্পর্কগুলি এবং সূচীগুলি একটি জয়েন্ট বজায় রয়েছে তা ধরে রেখে সামগ্রিকভাবে আরও ভাল সঞ্চালন করা হবে (আরও প্রচেষ্টা সেই অপারেশনের সাথে কাজ করার পরে অন্যদের সাথে কাজ করে)। আপনি যদি ধারণাটি সম্পর্কে এটি ভাবনা করেন তবে এটি 2 ক্যোয়ারী এবং 1 ক্যোয়ারির মধ্যে পার্থক্য।
আপনার এটিকে ক্যোরি অ্যানালাইজারের কাছে টানতে হবে এবং এটি চেষ্টা করে দেখুন এবং পার্থক্যটি দেখুন। এছাড়াও কোয়েরি এক্সিকিউশন প্ল্যানটি দেখুন এবং পদক্ষেপগুলি হ্রাস করার চেষ্টা করুন।
এই থ্রেডটি বেশ পুরানো তবে এখনও প্রায়শই উল্লেখ করা হয়েছে। আমার ব্যক্তিগত স্বাদের জন্য এটি কিছুটা অসম্পূর্ণ, কারণ উপস্থিতি কীওয়ার্ড সহ ডাটাবেসটি জিজ্ঞাসা করার আরও একটি উপায় রয়েছে যা আমি খুঁজে না পেয়ে আরও দ্রুত পেয়েছি।
সুতরাং আপনি যদি কেবল টেবিলের কোনও মানগুলিতে আগ্রহী হন তবে আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন:
SELECT a.*
FROM a
WHERE EXISTS (
SELECT *
FROM b
WHERE b.col = a.col
)
পার্থক্যটি বিশাল হতে পারে যদি করলকে সূচিযুক্ত না করা হয়, কারণ ডিবিতে b তে সমস্ত রেকর্ডের সন্ধান করতে হয় না যার কর্নে একই মান রয়েছে, এটি কেবল খুব প্রথম একটি খুঁজে বের করতে হবে। যদি বি.কোলে কোনও সূচক না থাকে এবং বা টেবিল স্ক্যানে প্রচুর রেকর্ড ফলাফল হতে পারে। IN বা JOIN এর সাথে এটি একটি সম্পূর্ণ টেবিল স্ক্যান হবে, অস্তিত্বের সাথে এটি কেবলমাত্র একটি আংশিক টেবিল স্ক্যান হবে (প্রথম মিলের রেকর্ড না পাওয়া পর্যন্ত)।
যদি বি তে প্রচুর রেকর্ড থাকে তবে যার সমান মান রয়েছে তবে আপনি এই অবস্থাটি সন্তুষ্ট কিনা তা খুঁজে পেতে কেবল অস্থায়ী জায়গায় এই সমস্ত রেকর্ড পড়ার জন্য প্রচুর স্মৃতি নষ্ট করবেন। বিদ্যমান থাকলে এটি সাধারণত এড়ানো যায়।
আমি প্রায়শই উপস্থিত থাকা সত্ত্বেও দ্রুত খুঁজে পেয়েছি ইনডেক্স থাকা সত্ত্বেও IN এটি ডেটাবেস সিস্টেম (অপ্টিমাইজার), ডেটার উপর নির্ভর করে এবং ব্যবহৃত হয় এমন সূচকের ধরণের উপর নির্ভর করে না।
প্রতিটি ডাটাবেসের বাস্তবায়ন তবে আপনি সম্ভবত অনুমান করতে পারেন যে তারা সবাই সাধারণ সমস্যাগুলি কমবেশি একইভাবে সমাধান করে। আপনি যদি এমএসএসকিউএল ব্যবহার করছেন তবে কার্যকর হয়েছে এমন কার্যকর বাস্তবায়ন পরিকল্পনাটি দেখুন। আপনি প্রোফাইলার এবং সম্পাদন পরিকল্পনাগুলি চালু করে এটি করতে পারেন। আপনি কমান্ডটি চালানোর সময় এটি আপনাকে একটি পাঠ্য সংস্করণ দেবে।
আপনি যে এমএসএসকিউএল ব্যবহার করছেন তার কোন সংস্করণ আমি নিশ্চিত নই তবে আপনি ক্যোয়ারী বিশ্লেষকটিতে এসকিউএল সার্ভার 2000 এ একটি গ্রাফিকাল পেতে পারেন। আমি নিশ্চিত যে এই কার্যকারিতাটি এসকিউএল সার্ভার স্টুডিও ম্যানেজারের পরবর্তী সংস্করণগুলিতে কিছুটা লুকিয়ে রেখেছে।
ছাড়ের পরিকল্পনাটি দেখুন। যতদূর সম্ভব টেবিল স্ক্যানগুলি এড়িয়ে চলুন যদি না আপনার টেবিলটি ছোট থাকে তবে কোনও সূচির ব্যবহারের চেয়ে কোনও টেবিল স্ক্যান দ্রুত হয়। প্রতিটি পৃথক দৃশ্যে যে আলাদা আলাদা জয়েন অপারেশন তৈরি হয় তা পড়ুন।
অপ্টিমাইজারটি আপনাকে সাধারণ প্রশ্নের জন্য একই ধরণের ফলাফল দেওয়ার জন্য যথেষ্ট স্মার্ট হওয়া উচিত। কার্যকর করার পরিকল্পনাটি পরীক্ষা করুন এবং তাদের আপনার একই জিনিস দেওয়া উচিত। যদি তারা তা না করে তবে আমি সাধারণত জিনকে দ্রুততর বলে বিবেচনা করব। সমস্ত সিস্টেম আলাদা, যদিও, আপনার সিস্টেমের কোডটি নিশ্চিত হওয়া উচিত।