এসকিউএল সার্ভার ইন বনাম উপস্থিতি পারফরম্যান্স


115

আমি কৌতূহল নিচের কোনটি আরও কার্যকর হবে?

আমি সর্বদা ব্যবহার সম্পর্কে কিছুটা সতর্ক INছিলাম কারণ আমি বিশ্বাস করি যে এসকিউএল সার্ভার ফলাফল সেটটিকে একটি বড় IFস্টেটমেন্টে পরিণত করে। বৃহত ফলাফলের সেটের জন্য, এটি খারাপ পারফরম্যান্সের ফলস্বরূপ। ছোট ফলাফলের সেটগুলির জন্য, আমি নিশ্চিত নই যে পছন্দনীয়। বড় ফলাফলের সেটগুলির জন্য, EXISTSআরও দক্ষ হবে না ?

WHERE EXISTS (SELECT * FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)

বনাম

WHERE bx.BoxID IN (SELECT BoxID FROM Base WHERE [Rank = 2])

8
এটি সন্ধান করার সর্বোত্তম উপায় হ'ল এটি ব্যবহার করে কিছু ম্যাসুরমেন্ট করা।
ক্লাউস বাইস্কোভ পেদারসেন

10
সেখানে কারো পেয়েছিলাম এই জন্য একটি gazillion সদৃশ ...... হতে
marc_s

5
@মার্ক_স - সম্ভবত তাই, তবে এই সময়টিতে আমাকে এই বিষয়ে সমস্ত পোস্ট দেখে এবং আমার ক্ষেত্রে উপযুক্ত একটি পোস্ট খুঁজে পেতে আমার প্রশ্নটির চারটি উত্তর ছিল।
র্যান্ডি মাইন্ডার

7
আপনি অনুপস্থিত করছি অবগতির জন্য যদি সবচেয়ে performant ভাবে, আপনি করতে পারেন select 1 from Base...আপনার where existsযেহেতু আপনি আসলে ফলাফল সম্পর্কে পরোয়া করি না, একটি সারিতে আসলে বিদ্যমান ঠিক যে।
ব্রড

2
@ মার্কস_স যা সত্যিই দুঃখজনক, কারণ স্ট্যাকওভারফ্লোতে আর কোনও আবর্জনা যুক্ত না করার জন্য পোস্টগুলি সন্ধান করার জন্য আমি সময় নিয়েছি। আমার কাজটি শেষ করতে আমার পছন্দসই উত্তরের দরকার নেই। এই ধরণের চিন্তাভাবনা যে উত্তম উত্তর দিয়ে কেবল কয়েকজনের জায়গায় গাজিলিয়ান
নকলকে যুক্ত করেছে

উত্তর:


140

EXISTS দ্রুততর হবে কারণ ইঞ্জিনটি একবার হিট পেয়ে গেলে এটি শর্তটি সত্য হিসাবে প্রমাণিত হওয়ায় এটি দেখা বন্ধ করবে।

সহ IN, এটি আরও প্রক্রিয়াজাতকরণের আগে সাব-কোয়েরি থেকে সমস্ত ফলাফল সংগ্রহ করবে।


4
এটা একটা ভাল দিক. আইএন বিবৃতিতে এসকিউএল সার্ভারকে একটি সম্পূর্ণ ফলাফলের সেট তৈরি করতে হবে এবং তারপরে একটি বড় আইএফ বিবৃতি তৈরি করুন যা আমি মনে করি create
র্যান্ডি মাইন্ডার

72
এটি সত্য হিসাবে ব্যবহৃত হত তবে বর্তমান সংস্করণগুলিতে (কমপক্ষে ২০০৮) অপটিমাইজারটি আরও স্মার্ট ... এটি আসলে একটি (EXISS) () এর মতোই IN () এর সাথে আচরণ করে।
অ্যারন বারট্র্যান্ড

11
অ্যারোন - হ্যাঁ, সাধারণত অপ্টিমাইজারটি অভ্যন্তরীণভাবে আরও ভাল পরিকল্পনা তৈরি করে। তবে অভ্যন্তরীণ শর্টকাটগুলির উপর নির্ভর করা আরও জটিল পরিস্থিতিতে ক্ষতিকারক হতে পারে।
স্কট কোটস

2
এটি কেবল সহজভাবে ভুল। এটি ছিল 2010 এবং এখনও আছে।
ম্যাগনাস

2
IN এবং বিদ্যমানগুলির ঠিক একই ক্যোয়ারী পরিকল্পনা রয়েছে এবং IO। পারফরম্যান্সে তারা আলাদা বলে ভাবার কোনও কারণ নেই। আপনার সময়ের পরিসংখ্যান পরীক্ষা করুন এবং নিজেকে প্রস্তুত করুন
নেলসন

40

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

1) কভারিং সূচকটি বাম, ডান বা উভয় পক্ষের মধ্যে উপস্থিত রয়েছে কিনা তাও স্পষ্টভাবে উল্লেখ নেই।

2) উভয়ই ইনপুট বাম পাশের সেট এবং ইনপুট ডান পাশের সেটটিকে বিবেচনা করে না।
(প্রশ্নটিতে একটি সামগ্রিক বৃহত ফলাফলের সেট উল্লেখ করা হয়েছে )।

আমি বিশ্বাস করি যে অপটিমাইজারটি "ইন" বনাম "বিদ্যমান" এর মধ্যে রূপান্তর করতে যথেষ্ট স্মার্ট, যখন (1) এবং (2) এর কারণে একটি উল্লেখযোগ্য ব্যয়ের পার্থক্য রয়েছে, অন্যথায় এটি কেবল একটি ইঙ্গিত হিসাবে ব্যবহার করা যেতে পারে (যেমন ব্যবহারের উত্সাহ দেওয়ার জন্য বিদ্যমান ডানদিকে একটি সন্ধানযোগ্য সূচক)।

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


3
কেন জানি এই দুর্দান্ত উত্তরটি আর মনোযোগ দেয় নি। উভয় পক্ষের সূচী / কাঠামো বোঝার ফলে আমি সম্মত হতে পারি। ভাল বলেছ.
শেলডনএইচ

আশাবাদী সর্বদাIN এবং এর জন্য একই পরিকল্পনা দেয় EXISTS। চেষ্টা করুন এবং যে কোন ক্ষেত্রে যেখানে তারা একই পরিকল্পনা পাবেন না সঙ্গে আসা পর্যন্ত (যদিও এই প্রযোজ্য নয় NOT INএবং NOT EXISTS)
মার্টিন স্মিথ

@ মার্টিনস্মিত আমি ধরে নিয়েছি আপনি কী জানেন সে সম্পর্কে আপনি জানেন তবে পরিকল্পনাগুলি সবসময় একই রকম থাকে তার কোনও প্রমাণ কি আপনার আছে? যদি তা হয় তবে এটি এখানে দশক-দীর্ঘ দ্বিমত পরিষ্কার করবে।
মারেডচিজ

@ মাররেডচিজ - সেই লোকেরা এই লোকদের উপর দাবী করছে যে এর একক উদাহরণ তৈরি করা অন্যরকম
মার্টিন স্মিথ

37

আমি এসকিউএল সার্ভার ২০০ 2005 এবং ২০০৮ এ কিছু পরীক্ষা করেছি এবং অন্যরা যেমন বলেছে ঠিক একই বাস্তব বাস্তবায়ন পরিকল্পনাটি নিয়ে উপস্থিত এবং উপস্থিত উভয় ক্ষেত্রেই ফিরে এসেছি। অপটিমাইজারটি সর্বোত্তম। :)

যদিও আপনার সচেতনতাকে সঠিকভাবে বাক্য না বললে কিছু উপস্থিত থাকতে পারে, বিদ্যমান, IN এবং JOIN মাঝে মাঝে বিভিন্ন ফলাফল ফিরে আসতে পারে: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210 .aspx


5

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

(টি-) এসকিউএল ল্যাঙ্গুয়েজে অনেক কীওয়ার্ড রয়েছে তবে শেষ পর্যন্ত কেবলমাত্র হার্ডওয়ারে ঘটে যাওয়া একমাত্র ঘটনাই এক্সিকিউশন ক্যোয়ারী প্ল্যানে দেখা যায় operations

রিলেশনাল (ম্যাথস থিওরি) অপারেশনটি আমরা যখন করি [NOT] INএবং [NOT] EXISTSঅর্ধ যোগ হয় (ব্যবহার করার সময় অ্যান্টি-জয়েন NOT) করি। এটি সম্পর্কিত কোনও স্কেল-সার্ভার অপারেশনের একই নাম নয় এটি কাকতালীয় ঘটনা নয় । কোনও অপারেশন নেই যা উল্লেখ করেছে INবা EXISTSকোথাও - কেবলমাত্র (বিরোধী) আধা যোগদান করে। সুতরাং, কোনও যুক্তিযুক্ত সমতুল্য INবনাম EXISTSপছন্দ পারফরম্যান্সকে প্রভাবিত করতে পারে এমন কোনও উপায় নেই কারণ তাদের ফলাফল পাওয়ার জন্য (বিরোধী) অর্ধে যোগ কার্যকরকরণ অপারেশন, একমাত্র এবং একমাত্র উপায় রয়েছে

একটি উদাহরণ:

প্রশ্ন 1 ( পরিকল্পনা )

select * from dt where dt.customer in (select c.code from customer c where c.active=0)

প্রশ্ন 2 ( পরিকল্পনা )

select * from dt where exists (select 1 from customer c where c.code=dt.customer and c.active=0)

আপনি এটি পরীক্ষা করেছেন? যদি তা হয়, তবে আপনি কি আপনার এসকিউএল এবং ফলাফলগুলি ভাগ করতে পারবেন?
আনহানডেলডএক্সসেপসিয়ান

এটি একাধিকবার পরীক্ষা করেছে। আমি অন্য একটি পরীক্ষার কেস তৈরি করতে পারি, এবং আমি করব, তবে একটি পরীক্ষার কেসটির অর্থ এই নয় যে অপটিমাইজার বিভিন্ন পরিসংখ্যান সহ টেবিলগুলিতে ঠিক একই পরিকল্পনাটি করবে। এর ফলে কারও মনে হতে পারে যে উত্তরটি আংশিক - তবে একাধিক সেমিজাইন অপারেটরের অস্তিত্বের বিষয়টি সত্য is হয়তো আমি কোথাও একটি তালিকা খুঁজে পেতে এবং এটি লিঙ্ক করব।
জর্জ মেনআটিস

5

আমি IN দিয়ে EXISS নিয়ে যাব, নীচের লিঙ্কটি দেখুন:

এসকিউএল সার্ভার: বনাম উপস্থিত বনাম উপস্থিতি - যৌক্তিক পার্থক্য

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

IN: একটি নির্দিষ্ট মান সাবকোয়ারি বা তালিকার কোনও মানের সাথে মিলে গেলে সত্যটি প্রত্যাবর্তন করে।

অস্তিত্ব: যদি কোনও সাবকিউরিতে কোনও সারি থাকে তবে সত্য ফিরে আসে।

যোগদান করুন: যোগদানের কলামে 2 টি ফলাফলের সাথে যোগ দেয়।

ব্লগের ক্রেডিট: https://stackoverflow.com/users/31345/mladen-prajdic


বাহ, আপনার ব্লগ এবং ব্যাখ্যা জন্য আপনাকে ধন্যবাদ।
খ্রিস্টান মুলার

3

মৃত্যুদণ্ড কার্যকর করার পরিকল্পনাগুলি সাধারণত এই ক্ষেত্রে অভিন্ন হতে চলেছে, তবে যতক্ষণ না আপনি সূচকের অন্যান্য সমস্ত দিকগুলিতে কীভাবে অপ্টিমাইজার উপাদানগুলি দেখেন না, আপনি সত্যিই কখনই জানতে পারবেন না।


3

সুতরাং, IN যেমন উপস্থিতি হিসাবে একই নয় তেমনি এটি একই বাস্তবায়ন পরিকল্পনা তৈরি করে।

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

সাধারণত আইএনটি বাইরের ক্যোয়ারির সাথে অভ্যন্তরীণ কোয়েরি সম্পর্কিত না করে ব্যবহার করা হয় এবং এটি কেবলমাত্র এক ধাপে সমাধান করা যেতে পারে (সেরা ক্ষেত্রে দৃশ্যে)।

এই বিবেচনা:

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

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

  3. উপরের সমস্তটি খেয়াল করা হবে যখন আপনার প্রতিটি টেবিলে মোটামুটি সারি থাকবে (ন্যায্যভাবে আমি এমন কিছু বোঝাতে চাইছি যা আপনার সিপিইউ প্রসেসিং এবং / অথবা ক্যাশের জন্য রাম প্রান্তিকের চেয়ে বেশি)।

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

কৌশলটি হল স্ক্যান করার জন্য সারিগুলির সংখ্যা সীমাবদ্ধ করা।

শুভেচ্ছা সহ,

MarianoC


1

অপ্টিমাইজ করতে EXISTS , খুব আক্ষরিক হন; কিছু ঠিক সেখানে থাকতে হবে, তবে আপনার আসলে সম্পর্কিত উপ-কোয়েরি থেকে ফিরে আসা কোনও ডেটার দরকার নেই। আপনি কেবল বুলিয়ান শর্তটি মূল্যায়ন করছেন।

তাই:

WHERE EXISTS (SELECT TOP 1 1 FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)

যেহেতু সম্পর্কযুক্ত সাব-কোয়েরিটি হ'ল RBAR, প্রথম ফলাফল হিট শর্তটিকে সত্য করে তোলে এবং এটি আর প্রক্রিয়া করা হয় না।


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

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

আমি এখনও পর্যন্ত এই পদ্ধতির সাথে কোনও পারফরম্যান্স সুবিধা দেখিনি। দয়া করে এক্সিকিউশন প্ল্যানের কিছু স্ক্রিনশটগুলি প্রদর্শন করুন
দাফাই 4

-1

আমার মাথার উপরের অংশটি বন্ধ রয়েছে এবং সঠিক হওয়ার গ্যারান্টি নেই: আমি বিশ্বাস করি এই ক্ষেত্রে দ্বিতীয়টি আরও দ্রুত হবে।

  1. প্রথমটিতে, সম্পর্কিত সম্পর্কিত সাবকোয়ারি সম্ভবত প্রতিটি সারির জন্য সাবকোরি চালানো হবে।
  2. দ্বিতীয় উদাহরণে, সাবকোয়ারিটি কেবল একবার চালানো উচিত, যেহেতু পরস্পরের সম্পর্ক নেই।
  3. দ্বিতীয় উদাহরণে, INউইলটি কোনও মিল খুঁজে পাওয়ার সাথে সাথে শর্ট সার্কিট করবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.