بهینه سازی دستور 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 مرتبط شده و …
- Bushy Tree که در آن از یک سو جدول A به B مرتبط شده، از سوی دیگر جدول D به C و حاصل این دو JOIN به یکدیگر JOIN شده اند و ….
در حالتی که جداول به صورت 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 منجر خواهد شد.