পারফরম্যান্সে এসকিউএল যোগ দিন?


164

আমার একটি কেস রয়েছে যেখানে একটি যোগদান বা আইএন ব্যবহার করে আমাকে সঠিক ফলাফল দেবে ... সাধারণত কোনটি ভালভাবে সম্পাদন করে এবং কেন? আপনি কোন ডাটাবেস সার্ভারটি চালাচ্ছেন তার উপর এটি কতটা নির্ভর করে? (এফওয়াইআই আমি এমএসএসকিউএল ব্যবহার করছি)


:) আমি যখন আমি কিছুক্ষণ আগে একইরকম কিছু নিয়ে গবেষণা করেছিলাম তখন আমি অন্যরকম একটি নিবন্ধের সন্ধান করছিলাম, এবং ভুল করে
সেটিকে পেরেছি

সম্ভাব্য দ্বাপের জন্য দুঃখিত ... আমি অনুসন্ধান করতে গিয়ে এই প্রশ্নটি
পাইনি

উত্তর:


196

সাধারণত বলা হয়, 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

পারফরম্যান্স বিশদের জন্য আমার ব্লগে এই নিবন্ধটি দেখুন:


হ্যাঁ এটা বোঝা যায় যে যোগদানকারী কলামটি অনন্য হলে এটিই কার্যকর করা হবে (যা এটি আমার ক্ষেত্রে)
পোলারিস 878

1
অনুরূপ নোটে, আমি কি (সিলেক্ট ডিস্টিন্ট ...) বা কেবল ইন (নির্বাচন ...) ব্যবহার করব?
মু

8
@ অর্ল্যান্ডু :৩: INবোঝা যাচ্ছে DISTINCTSQL Serverএটি লক্ষ্য করার জন্য যথেষ্ট স্মার্ট, এবং উভয় প্রশ্নের জন্য একই পরিকল্পনা তৈরি করবে। অন্যরা কীভাবে RDBMSআচরণ করবে তা নিশ্চিত নয় ।
কাসনসুই

>> ইন এবং জোইন হ'ল আলাদা ক্যোয়ারী যা বিভিন্ন ফলাফল দিতে পারে। আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে বি.সি.এল অনন্য না থাকলেও কেন এটি এক্ষেত্রে আলাদা ফলাফল তৈরি করবে?
অভিজিৎ

explainextended.com/2009/06/16/in-vs-join-vs-exists সত্যিই আমাকে সাহায্য করে .. .. আপনাকে ধন্যবাদ
আব্বাস Galiyakotwala

27

মজার আপনি উল্লেখ যে, আমি এই বিষয়ে একটি ব্লগ পোস্ট করেছি।

দেখুন ওরাকল বনাম মাইএসকিউএল SQL সার্ভার বনাম: সমষ্টি বনাম যোগদান করেছে

সংক্ষিপ্ত উত্তর: আপনাকে এটি পরীক্ষা করতে হবে এবং স্বতন্ত্র ডাটাবেসগুলি অনেক বেশি পরিবর্তিত হয়।


6

এটি বলা বাহুল্য শক্ত - কোনটি আরও ভালভাবে কাজ করে তা সত্যভাবে খুঁজে বের করার জন্য আপনাকে মৃত্যুদন্ড কার্যকর করার সময় প্রকৃতপক্ষে প্রোফাইল তৈরি করতে হবে।

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

তবে আপনি আউট জয়েন ব্যবহার শুরু করার সাথে সাথে, বা যদি আপনার কাছে বিদেশী কী সূচকগুলি না থেকে থাকে তবে IN দ্রুততর হতে পারে।

আঙ্গুরের ছিরড়া


আমি এটিও ভাবছিলাম ... কারণ মনে হয়
জিন

4

যৌক্তিক পার্থক্যের উপর একটি আকর্ষণীয় লিখনআপ : এসকিউএল সার্ভার: বনাম উপস্থিত বনাম উপস্থিতি - যৌক্তিক পার্থক্য

আমি দৃ sure়ভাবে নিশ্চিত যে সম্পর্কগুলি এবং সূচীগুলি একটি জয়েন্ট বজায় রয়েছে তা ধরে রেখে সামগ্রিকভাবে আরও ভাল সঞ্চালন করা হবে (আরও প্রচেষ্টা সেই অপারেশনের সাথে কাজ করার পরে অন্যদের সাথে কাজ করে)। আপনি যদি ধারণাটি সম্পর্কে এটি ভাবনা করেন তবে এটি 2 ক্যোয়ারী এবং 1 ক্যোয়ারির মধ্যে পার্থক্য।

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


4

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

সুতরাং আপনি যদি কেবল টেবিলের কোনও মানগুলিতে আগ্রহী হন তবে আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন:

SELECT  a.*
FROM    a
WHERE   EXISTS (
    SELECT  *
    FROM    b
    WHERE   b.col = a.col
    )

পার্থক্যটি বিশাল হতে পারে যদি করলকে সূচিযুক্ত না করা হয়, কারণ ডিবিতে b তে সমস্ত রেকর্ডের সন্ধান করতে হয় না যার কর্নে একই মান রয়েছে, এটি কেবল খুব প্রথম একটি খুঁজে বের করতে হবে। যদি বি.কোলে কোনও সূচক না থাকে এবং বা টেবিল স্ক্যানে প্রচুর রেকর্ড ফলাফল হতে পারে। IN বা JOIN এর সাথে এটি একটি সম্পূর্ণ টেবিল স্ক্যান হবে, অস্তিত্বের সাথে এটি কেবলমাত্র একটি আংশিক টেবিল স্ক্যান হবে (প্রথম মিলের রেকর্ড না পাওয়া পর্যন্ত)।

যদি বি তে প্রচুর রেকর্ড থাকে তবে যার সমান মান রয়েছে তবে আপনি এই অবস্থাটি সন্তুষ্ট কিনা তা খুঁজে পেতে কেবল অস্থায়ী জায়গায় এই সমস্ত রেকর্ড পড়ার জন্য প্রচুর স্মৃতি নষ্ট করবেন। বিদ্যমান থাকলে এটি সাধারণত এড়ানো যায়।

আমি প্রায়শই উপস্থিত থাকা সত্ত্বেও দ্রুত খুঁজে পেয়েছি ইনডেক্স থাকা সত্ত্বেও IN এটি ডেটাবেস সিস্টেম (অপ্টিমাইজার), ডেটার উপর নির্ভর করে এবং ব্যবহৃত হয় এমন সূচকের ধরণের উপর নির্ভর করে না।


3
এমএসএসকিএল-তে সত্য যে উপস্থিত রয়েছে তা কোনও আইএন-এর চেয়ে ভাল। আরো তথ্যের জন্য: explainextended.com/2009/06/16/in-vs-join-vs-exists এখানে উপর আপনি পড়তে পারেন যে: "অনেক মনে করেন যে, বিদ্যমান আরও দক্ষ যে, কারণ রিটার্ন শুধুমাত্র এক সারি বিদ্যমান এই। এসকিউএল সার্ভারের জন্য সত্য নয়, যেমন আমরা উপরের উদাহরণগুলি থেকে দেখতে পাচ্ছি, উপস্থিতি এবং IN হুবহু একই পরিকল্পনা তৈরি করে This এটির কারণ হ'ল উপস্থিতি IN এর তুলনায় আরও নমনীয় always ) তবে বিপরীত নয়। "
মাইকেল ফ্যালিক্স

3

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

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

ছাড়ের পরিকল্পনাটি দেখুন। যতদূর সম্ভব টেবিল স্ক্যানগুলি এড়িয়ে চলুন যদি না আপনার টেবিলটি ছোট থাকে তবে কোনও সূচির ব্যবহারের চেয়ে কোনও টেবিল স্ক্যান দ্রুত হয়। প্রতিটি পৃথক দৃশ্যে যে আলাদা আলাদা জয়েন অপারেশন তৈরি হয় তা পড়ুন।


1

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


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