تجربیات کاری چند دوست

در این وبلاگ تجربیاتی که در حین کار بدست آورده ایم را به اشتراک خواهیم گذاشت

تجربیات کاری چند دوست

در این وبلاگ تجربیاتی که در حین کار بدست آورده ایم را به اشتراک خواهیم گذاشت

تجربیات کاری چند دوست
آخرین نظرات
  • ۱۶ مرداد ۹۸، ۰۱:۰۰ - علی جهان نما
    عالی بود

سوال ) تفاوت 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(*) 
---------- 

ولی این پاسخ نشان میدهد ۹ نفر مدیر نیستند! 

    از مقادیر 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 میباشد در صورتی که :
              مقدار اطلاعاتی که  پرس و جوی درونی بر روی آن اجرا میشود کوچک باشد . 

              پاسخ پرس و جوی درونی کوچک باشد . 


    ج) سخن پایانی 

به طور کلی بهتر است در صورتی که امکان استفاده از پیوند - Join - بجای Exists  وجود دارد از پیوند استفاده کنیم همینطور  همیشه استفاده از عبارات Exists/ Not Exists   توصیه میشود مگر اینکه دلیلی برای استفاده نکردن از آن ها داریم . 


  • موافقین ۲ مخالفین ۰
  • ۹۶/۱۰/۱۵
  • ۲۰۶۸ نمایش
  • صادق جوانمرد

PERFORMANCE

PL\SQL

SQL

نظرات (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی