سوال ) تفاوت In/Not In و Exists/Not Exists در چیست ؟ کدامیک سریع تر هستند ؟
الف) تفاوت در نتیجه
همیشه Not In و Not Exists شبیه هم نیستند و ممکن است پاسخ های متفاوتی داشته باشند .
(مثال ۱ ) به طور مثال :
select count(*) from emp where empno not in ( select mgr from emp );
COUNT(*)
----------
0
این پاسخ به ما میگوید که همه مدیر هستند .
حال به پرس و جوی زیر دقت کنید :
select count(*) from emp T1 where not exists ( select null from emp T2 where t2.mgr = t1.empno );
COUNT(*)
----------
9
ولی این پاسخ نشان میدهد ۹ نفر مدیر نیستند!
از مقادیر Null در Not In پرهیز کنید ! در این صورت پاسخ با آن چیزی که انتظار دارید متفاوت خواهد بود . ( این یکی از دلایلی است که ما را برای استفاده از Not Exists مجاب میکند. ) دلیل این رفتار در مواجه با Null این است که Null در پایگاه داده به معنای ناشناخته -Unknown- میباشد و وقتی در یک عبارت Not In نتیجه پرس و جوی درونی شامل Null باشد پایگاه داده نمیتواند تایید کند که مقدار مورد نظر در مجموعه پاسخ وجود ندارد ، چرا که مجموعه پاسخ شامل مقادیر نامشخص میباشد .در مثال ۱ مقدار mgr در بعضی از رکورد ها Null میباشد و به همین دلیل پرس و جوی اول پاسخی غیر منتظره و نه الزاما غلط! داشت .
ب) نحوه اجرای آن ها متفاوت است
با وجود اینکه در بسیاری از مواقع oracle cost-base optimizer پلن یکسانی برای اجرای In و Exists ایجاد خواهد کرد و در نتیجه تفاوتی در بهینگی آن ها وجود نخواهد داشت ، یک عبارت Exists نتیجه درست یا غلط - True / False - باز میگرداند ولی یک عبارت In تمام مقادیر در زیر جستجوی متناظر را مقایسه میکند . اگر از In استفاده کنید موتور پرس و جو تمام نتایج بازگردانده شده از پرس و جوی داخل عبارت In را پیمایش خواهد کرد . در مقابل ، اگر از Exists استفاده کنیم موتور پرس و جو به محض یافتن اولین مقدار درست پیمایش را متوقف خواهد کرد . این بزرگترین تفاوت دو عبارت Exists و In ، همینطور Not Exists و Not In میباشد .
Exists سریعتر از In میباشد در صورتی که :
مقدار اطلاعاتی که پرس و جوی درونی بر روی آن اجرا میشود بزرگ باشد .
پاسخ پرس و جوی درونی بزرگ باشد .
In سریعتر از Exists میباشد در صورتی که :
مقدار اطلاعاتی که پرس و جوی درونی بر روی آن اجرا میشود کوچک باشد .
پاسخ پرس و جوی درونی کوچک باشد .