ইন বনাম বা এসকিউএল যেখানে ক্লোজ


150

বড় ডেটাবেসগুলির সাথে ডিল করার সময় কোনটি আরও ভাল সম্পাদন করে, INবা ORএসকিউএল- Whereক্লাউসে?

তাদের মৃত্যুদণ্ড কার্যকর করার উপায় নিয়ে কি কোনও পার্থক্য রয়েছে?


আমার প্রথম অনুমানটি হ'ল OR আরও ভাল পারফরম্যান্স করে, যদি না এসকিউএল ইঞ্জিন দৃশ্যের পিছনে বা IN তে রূপান্তর করে। আপনি কি এই দুজনের কোয়েরি প্ল্যান দেখেছেন?
রাজ

উত্তর:


170

আমি ধরে নিলাম আপনি নিম্নলিখিতগুলির মধ্যে পারফরম্যান্সের পার্থক্যটি জানতে চান:

WHERE foo IN ('a', 'b', 'c')
WHERE foo = 'a' OR foo = 'b' OR foo = 'c'

মাইএসকিউএল-এর জন্য ম্যানুয়াল অনুসারে মানগুলি যদি ধ্রুবক হয় INতালিকানুক্রমিক হয় এবং তারপরে একটি বাইনারি অনুসন্ধান ব্যবহার করে। আমি কল্পনা করব যে ORকোনও নির্দিষ্ট ক্রমে একে একে তাদের মূল্যায়ন করে। তাই INকিছু পরিস্থিতিতে দ্রুত হয়।

সবচেয়ে ভাল উপায় হ'ল আপনার ডেটাবেজে দুটি নির্দিষ্ট করে আপনার নির্দিষ্ট ডেটা দিয়ে কোনটি দ্রুত তা দেখার জন্য প্রোফাইল করা।

আমি উভয়ই 1000000 সারি দিয়ে একটি মাইএসকিউএলে চেষ্টা করেছি। কলামটি যখন সূচিযুক্ত হয় তখন কার্য সম্পাদনের ক্ষেত্রে কোনও পার্থক্য নেই - উভয়ই প্রায় তাত্ক্ষণিক। যখন কলামটি সূচিত হয় না আমি এই ফলাফলগুলি পেয়েছি:

SELECT COUNT(*) FROM t_inner WHERE val IN (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000);
1 row fetched in 0.0032 (1.2679 seconds)

SELECT COUNT(*) FROM t_inner WHERE val = 1000 OR val = 2000 OR val = 3000 OR val = 4000 OR val = 5000 OR val = 6000 OR val = 7000 OR val = 8000 OR val = 9000;
1 row fetched in 0.0026 (1.7385 seconds)

সুতরাং এই ক্ষেত্রে OR ব্যবহারের পদ্ধতিটি প্রায় 30% ধীর। আরও পদ যুক্ত করা পার্থক্য আরও বড় করে তোলে। অন্যান্য ডেটাবেস এবং অন্যান্য ডেটাতে ফলাফলগুলি পৃথক হতে পারে।


20
অপ্টিমাইজারটি যদি এর লবণের মূল্যবান হয় তবে তাদের একই কাজ করা উচিত।
জ্যানিক বার্নেট

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

2
@ মার্কবায়ার্স সর্বদা অপ্টিমাইজারটি একের ORসাথে একাধিক গুলি বিকল্প করতে পারে না IN?
tymtam

36

সন্ধানের সর্বোত্তম উপায় হ'ল কার্যনির্বাহী পরিকল্পনাটি।


আমি ওরাকল দিয়ে এটি চেষ্টা করেছিলাম , এবং এটা ঠিক একই ছিল।

CREATE TABLE performance_test AS ( SELECT * FROM dba_objects );

SELECT * FROM performance_test
WHERE object_name IN ('DBMS_STANDARD', 'DBMS_REGISTRY', 'DBMS_LOB' );

যদিও কোয়েরিটি ব্যবহার করে IN, এক্সিকিউশন প্ল্যান্ট বলে যে এটি ব্যবহার করে OR:

--------------------------------------------------------------------------------------    
| Id  | Operation         | Name             | Rows  | Bytes | Cost (%CPU)| Time     |    
--------------------------------------------------------------------------------------    
|   0 | SELECT STATEMENT  |                  |     8 |  1416 |   163   (2)| 00:00:02 |    
|*  1 |  TABLE ACCESS FULL| PERFORMANCE_TEST |     8 |  1416 |   163   (2)| 00:00:02 |    
--------------------------------------------------------------------------------------    

Predicate Information (identified by operation id):                                       
---------------------------------------------------                                       

   1 - filter("OBJECT_NAME"='DBMS_LOB' OR "OBJECT_NAME"='DBMS_REGISTRY' OR                
              "OBJECT_NAME"='DBMS_STANDARD')                                              

1
ওরাকলটিতে কী ঘটে যদি আপনি পরীক্ষা করে দেখছেন যে 3 টিরও বেশি মান আছে? আপনি কি জানেন যে ওরাকল মাইএসকিউএল হিসাবে একই বাইনারি অনুসন্ধান অপ্টিমাইজেশন করতে পারছে না বা এটি উভয় ক্ষেত্রেই এটি সম্পাদন করে?
মার্ক বাইয়ার্স

2
@ মার্ক বাইয়ার্স: আমি 10 টি মান সহ একই ক্যোয়ারী চেষ্টা করেছি, এখনও একই ফলাফল। দ্রষ্টব্য, যে অপ্টিমাইজারটি বর্ণানুক্রমিক ক্রমে আমার মানগুলি পুনরুদ্ধার করে। ওরাকল যদি সেই ফিল্টারটির কিছু অভ্যন্তরীণ অপ্টিমাইজেশন করে তবে আমি অবাক হব না ...
পিটার ল্যাং

5
ওরাকল এর একটি INLIST ITERATORঅপারেশনও রয়েছে, যা এটি নির্বাচন করতে পারে যদি এটি ব্যবহার করতে পারে এমন কোনও সূচক থাকে। এখনও, যখন আমি চেষ্টা, উভয় INএবং ORএকই ফাঁসি পরিকল্পনা দিয়ে শেষ।
চেরান শানমুগাভেল

7

OR অপারেটরটির IN নির্মাণের চেয়ে অনেক বেশি জটিল মূল্যায়ন প্রক্রিয়া প্রয়োজন কারণ এটি অনেকগুলি শর্তের অনুমতি দেয়, কেবল আইএন এর মতো সমান নয়।

এখানে আপনি ওআর এর সাথে কী ব্যবহার করতে পারবেন তার একটি মত রয়েছে তবে এটি আইএন: এর চেয়ে বেশি উপযুক্ত নয়। বৃহত্তর বা সমান, কম, কম বা সমান, LIKE এবং আরও কিছু ওরাকল REGEXP_LIKE এর মতো। এছাড়াও বিবেচনা করুন যে শর্তগুলি সর্বদা একই মানের সাথে তুলনা না করে।

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

[সম্পাদনা] সম্ভবত কোনও অপ্টিমাইজার মূল্যায়ন প্রক্রিয়াটি অপ্টিমাইজড প্রয়োগ করতে পারে না, তবে এটি ব্যয় করে না যে এটি একবার ঘটতে পারে (একটি ডাটাবেস সংস্করণ আপগ্রেড সহ)। সুতরাং আপনি যদি ওআর অপারেটরটি ব্যবহার করেন তবে অনুকূলিতকরণের ক্ষেত্রে আপনার ক্ষেত্রে প্রযোজ্য হবে না।


6

আমি মনে করি ওরাকল কম দক্ষ একজনকে (যেটি হোক) অন্যকে রূপান্তর করতে যথেষ্ট স্মার্ট। সুতরাং আমি মনে করি উত্তরটি প্রতিটিটির পঠনযোগ্যতার উপর নির্ভর করবে (যেখানে আমি মনে করি যে এটি INপরিষ্কারভাবে জিতবে)


2

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

অন্য বিকল্প হ'ল JOINঅস্থায়ী টেবিল সহ একটি ব্যবহার করা ।
আমি মনে করি না পারফরম্যান্সের সমস্যা হওয়া উচিত, যদি আপনার প্রয়োজনীয় সূচক থাকে।


-2

আমি একটি বিশাল সংখ্যক ওআর (350) এ এসকিউএল কোয়েরি করেছি। পোস্টগ্রিস এটি 437.80 মিমি করে

OR ব্যবহার করুন

এখন IN ব্যবহার করুন:

IN ব্যবহার করুন

23.18ms


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