বড় ডেটাবেসগুলির সাথে ডিল করার সময় কোনটি আরও ভাল সম্পাদন করে, IN
বা OR
এসকিউএল- Where
ক্লাউসে?
তাদের মৃত্যুদণ্ড কার্যকর করার উপায় নিয়ে কি কোনও পার্থক্য রয়েছে?
বড় ডেটাবেসগুলির সাথে ডিল করার সময় কোনটি আরও ভাল সম্পাদন করে, IN
বা OR
এসকিউএল- Where
ক্লাউসে?
তাদের মৃত্যুদণ্ড কার্যকর করার উপায় নিয়ে কি কোনও পার্থক্য রয়েছে?
উত্তর:
আমি ধরে নিলাম আপনি নিম্নলিখিতগুলির মধ্যে পারফরম্যান্সের পার্থক্যটি জানতে চান:
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% ধীর। আরও পদ যুক্ত করা পার্থক্য আরও বড় করে তোলে। অন্যান্য ডেটাবেস এবং অন্যান্য ডেটাতে ফলাফলগুলি পৃথক হতে পারে।
IN
পদ্ধতির অতিরিক্ত কাঠামো সম্ভবত সম্পর্কিত সম্পর্কিত OR
ধারাগুলির পুরো গুচ্ছের চেয়ে অনুকূলকরণ করা সহজ করে তোলে । আমি যদি এমন কোনও ইঞ্জিন থাকে যেখানে OR
পদ্ধতিটি দ্রুততর হয় তবে আমি অবাক হয়ে যাব, কিন্তু আমি যখন অবাক হয়ে যাই তখন কখনও অবাক হই না যে যখন ওআর ধীর হয়।
OR
সাথে একাধিক গুলি বিকল্প করতে পারে না IN
?
সন্ধানের সর্বোত্তম উপায় হ'ল কার্যনির্বাহী পরিকল্পনাটি।
আমি ওরাকল দিয়ে এটি চেষ্টা করেছিলাম , এবং এটা ঠিক একই ছিল।
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')
INLIST ITERATOR
অপারেশনও রয়েছে, যা এটি নির্বাচন করতে পারে যদি এটি ব্যবহার করতে পারে এমন কোনও সূচক থাকে। এখনও, যখন আমি চেষ্টা, উভয় IN
এবং OR
একই ফাঁসি পরিকল্পনা দিয়ে শেষ।
OR অপারেটরটির IN নির্মাণের চেয়ে অনেক বেশি জটিল মূল্যায়ন প্রক্রিয়া প্রয়োজন কারণ এটি অনেকগুলি শর্তের অনুমতি দেয়, কেবল আইএন এর মতো সমান নয়।
এখানে আপনি ওআর এর সাথে কী ব্যবহার করতে পারবেন তার একটি মত রয়েছে তবে এটি আইএন: এর চেয়ে বেশি উপযুক্ত নয়। বৃহত্তর বা সমান, কম, কম বা সমান, LIKE এবং আরও কিছু ওরাকল REGEXP_LIKE এর মতো। এছাড়াও বিবেচনা করুন যে শর্তগুলি সর্বদা একই মানের সাথে তুলনা না করে।
ক্যোয়ারী অপ্টিমাইজারের জন্য আইএন অপারেটর পরিচালনা করা আরও সহজ কারণ কেবলমাত্র এমন একটি নির্মাণ যা একই মানটিতে অপারেটর সহ একাধিক শর্তে OR অপারেটরকে সংজ্ঞায়িত করে। আপনি যদি ওআর অপারেটরটি ব্যবহার করেন তবে অপ্টিমাইজারটি বিবেচনা করতে পারে না যে আপনি সর্বদা একই মানের উপর = অপারেটর ব্যবহার করছেন এবং যদি এটি আরও গভীর এবং আরও জটিল বিবরণ না সম্পাদন করে তবে সম্ভবত এটি বাদ দিতে পারে যে কেবল সেখানেই থাকতে পারে ইতিমধ্যে উল্লিখিত বাইনারি অনুসন্ধানের মতো অপ্টিমাইজড অনুসন্ধান পদ্ধতিগুলির ফলস্বরূপ অবমূল্যায়ন সহ সমস্ত জড়িত শর্তে একই মানগুলির জন্য অপারেটরগুলি।
[সম্পাদনা] সম্ভবত কোনও অপ্টিমাইজার মূল্যায়ন প্রক্রিয়াটি অপ্টিমাইজড প্রয়োগ করতে পারে না, তবে এটি ব্যয় করে না যে এটি একবার ঘটতে পারে (একটি ডাটাবেস সংস্করণ আপগ্রেড সহ)। সুতরাং আপনি যদি ওআর অপারেটরটি ব্যবহার করেন তবে অনুকূলিতকরণের ক্ষেত্রে আপনার ক্ষেত্রে প্রযোজ্য হবে না।
OR
তুলনা করার জন্য যখন কম মান থাকে তখন (পড়ার যোগ্যতার দৃষ্টিকোণ থেকে) উপলব্ধি করা হয়।
IN
কার্যকর এসএসপি। যখন আপনার একটি গতিশীল উত্স থাকে, যার সাথে আপনি মানগুলি তুলনা করতে চান।
অন্য বিকল্প হ'ল JOIN
অস্থায়ী টেবিল সহ একটি ব্যবহার করা ।
আমি মনে করি না পারফরম্যান্সের সমস্যা হওয়া উচিত, যদি আপনার প্রয়োজনীয় সূচক থাকে।
আমি একটি বিশাল সংখ্যক ওআর (350) এ এসকিউএল কোয়েরি করেছি। পোস্টগ্রিস এটি 437.80 মিমি করে ।
এখন IN ব্যবহার করুন:
23.18ms