بهینه سازی دستور SELECT در SQL Server (بخش دوم)

بهینه سازی دستور SELECT در SQL Server (بخش دوم)

بدون دیدگاه

بهینه سازی دستور SELECT در SQL Server (بخش دوم)

در موارد بسیاری حین بکار گیری دستور SELECT نیاز به بهینه سازی دستور SELECT در SQL Server وجود دارد. همانظور که در بخش اول بهینه سازی دستور SELECT دیدیم چگونه با بکارگیری لیست ستون‌ها می‌توان به بهینه سازی دستور SELECT کمک کرد. در اینجا راهکاری افزایش کارایی دستور SELECT را خواهیم دید.

با توجه به استفاده از عملگر JOIN در دستور SELECT و کاربرد آن در T-SQL، در نظر نگرفتن نکات زیر می‌تواند موجب افت کارایی دستور SELECT شود. Database آموزشی مایکروسافت به نام Adventure Works کاربردهای عملگر LIKE در SQL Server را خواهید دید.

با اینکه Query Optimizer موجود در SQL Server Database Engine حین اجرای دستورات شما، در پی بدست آوردن بهترین و بهینه ترین Execution Plan می‌باشد، اما بسته به شرایط و پیچیدگی Query ممکن است انتخاب درست را انجام ندهد. فرض کنید قرار است از بین ۱۰۰ حالت مختلف Execution Plan در کمترین زمان ممکن بهترین Execution Plan انتخاب شود. حالا اگر تعداد حالت های موجود برای Execution Plan و اجرای دستور شما به ۱۰۰،۰۰۰ برسد، قطعا در همان زمان کوتاه احتمال یافتن روش بهینه برای اجرای دستورات شما دشوارتر خواهد شد.

با در ذهن داشتن موضوع فوق، تصور کنید چند جدول A و B و C و D و E را با استفاده از یکی از انواع JOIN به هم مرتبط کرده‌اید. با توجه به اینکه به چه روشی شما JOIN را انجام داده‌اید، کوئری شما به طور کلی یکی از دو ساختار زیر را خواهد داشت:

  • Left-Deep Tree که در آن ابتدا جدول A به جدول B مرتبط شده و سپس حاصل آنها به جدول C و ترکیب JOIN جداول A, B, C به D مرتبط شده و …
نمونه JOIN جدول‌ها در SQL Server به صورت Left-Deep Tree - بهینه سازی دستور SELECT در SQL Server
  • Bushy Tree که در آن از یک سو جدول A به B مرتبط شده، از سوی دیگر جدول D به C و حاصل این دو JOIN به یکدیگر JOIN شده اند و ….
نمونه JOIN جدول‌ها در SQL Server به صورت Bushy Tree - بهینه سازی دستور SELECT در SQL

در حالتی که جداول به صورت Left-Deep Tree با یکدیگر JOIN می‌شوند با فرض داشتن n جدول، تعداد حالات ممکن !n خواهد بود. به طور مثال اگر ۳ جدول را با این روش با هم JOIN کرده باشیم، حالات ممکن !۳ خواهد بود که برابر با ۶ حالت است. در صورتی که برای n جدول که به صورت Bushy Tree با یکدیگر JOIN شده باشند تعداد حالات !(n – 1) / !(2n – 2) خواهد بود. این عدد برای ۳ جدول برابر با ۱۲ می‌باشد. حال اگر تعداد جداول به ۶ یا ۷ عدد برسد، محاسبه شما چه اعدادی را برای حالات Left-Deep Tree و Bushy Tree نمایش می‌دهد؟ قطعا به اعداد بسیار متفاوتی رسیده‌اید. حال تصور کنید Query Optimizer می‌خواهد برای یافتن بهترین روش اجرای Query و بهینه سازی دستور SELECT از بین این تعداد حالت، انتخاب درستی داشته باشد.

هرچه تعداد حالات موجود بیشتر باشد، احتمال انتخاب Execution Plan نامناسب برای اجرای کوئری توسط Query Optimizer بالاتر خواهد رفت.

بنابراین، تا حد امکان از بوجود آوردن ساختار Bushy Tree حین JOIN کردن جداول پرهیز نمایید. به این روش با استفاده از روش Left-Deep Tree می‌توانید به Query Optimizer امکان انتخاب روش اجرای بهینه را برای کوئری خود داده و که خود به بهینه شدن دستور SELECT در SQL Server منجر خواهد شد. 

آواتار کاربر

شهاب ساری اصلانی

از سال 1385 به صورت جدی مشغول تدریس در حوزه های برنامه نویسی دات نت و طراحی بانک های اطلاعاتی بوده ام. تدریس به عنوان یک حرفه همیشه برایم جذاب بوده و یادگیری جدیدترین مباحث لذت بخش است.

ارسال یک دیدگاه

آدرس ایمیل شما منتشر نخواهد شد.