تکنیکهای بهینه سازی پرس و جوها در SQL Server: اصول پایه – بخش اول

تکنیکهای بهینه سازی پرس و جوها در SQL Server: اصول پایه – بخش اول

مقدمه

رفع و جلوگیری از مشکلات مربوط به کارایی، برای موفقیت هر برنامه کاربردی بسیار مهم است. ما از انواع ابزارها و بهترین روشها برای ارائه مجموعه ای از تکنیک ها استفاده خواهیم کرد که می تواند برای تحلیل کارایی و افزایش کارایی دیتابیس های شما در شرایط متفاوت، استفاده شود!

حتما شما هم قبول دارید که بحث های مربوط به افزایش کارایی و تحقیق روی آن، بسیار رضایت بخش است. گرفتن یک سیستم که عملکرد آن کابوسی برای صاحبش شده و تنظیم آن به چیزی سریع و کارآمد بسیار عالی است و بدون شک دیگران را خوشحال خواهد کرد.

بهینه سازی واقعا مثل حرفه کارآگاهی است. اتفاق وحشتناکی رخ داده است و برای یافتن و دستگیری مقصر باید سرنخ هایی را دنبال کنید! این سری مقاله ها درمورد این سرنخ ها، نحوه شناسایی آنها و نحوه استفاده از آنها به منظور پیدا کردن دلیل اصلی یک مشکل عملکردی است.

تعریف بهینه سازی

“بهینه” چیست؟ پاسخ به این سوال خیلی چیزها را مشخص می کند، مثلا اینکه چه زمانی یک مشکل تمام شده و می توانید سراغ مشکل بعدی بروید و حتی بالاتر از این، اصلا چه زمانی با یک مشکل برخورد خواهید کرد. غالباً می توان پرس و جوها (Query) را از طریق روش های مختلفی انجام داد که هرکدام دارای زمان و هزینه صرف منابع مختلفی هستند.

منابع همیشه محدود هستند، ما معمولاً نمی توانیم منابع مورد نیاز برای اجرای یک اسکریپت با سریعتر زمان ممکن را هزینه کنیم و البته این کار اصلا منطقی هم نیست. به خاطر سادگی، ما “بهینه” را به عنوان نقطه ای که یک پرس و جو کار خود را در زمان قابل قبولی انجام می دهد و این کار را برای مدت معقولی در آینده هم ادامه خواهد داد، تعریف می کنیم. این تعریف هر دو جنبه تجاری و فنی را داراست. با پول ، وقت و منابع محاسباتی نامحدود، هر چیزی ممکن است، اما ما تجملاتی به اسم منابع نامحدود نداریم و بنابراین باید مشخص کنیم هر زمان که با مشکلی در کارایی مواجه می شویم، چطور باید مشکل خود را حل کنیم.

این منطق برای ما نقاط کنترلی را مشخص می کند که هنگام پروسه بهینه سازی، پیشرفت خود را بسنجیم و مورد ارزیابی مجدد انجام دهیم و مشخص کنیم تا چه زمانی باید کار را ادامه دهیم:

  1. اکنون پرس و جو عملکرد مناسب را دارد.
  2. منابع مورد نیاز برای بهینه سازی بیشتر، بسیار گران هستند.
  3. ما به نقطه ای از شکستن کار رسیده ایم که برای هرگونه بهینه سازی روی بخش های مستقل، آماده هستیم.
  4. یک راه حل کاملاً متفاوت پیدا شده است که حل این مسئله را غیر ضروری می کند.

بهینه سازی بیش از حد خوب به نظر می رسد، اما وقتی پای مدیریت منابع در میان باشد، به طور کلی بی فایده است. یک ایندکس کامل روی جدول (اما غیر ضروری) برای ما بار محاسباتی غیر ضروری زیادی در هنگام درج و به روز رسانی جدول به همراه خواهد داشت که خود سبب هدر رفت بالایی می شود. در نظر داشته باشید که اگر بخواهید یک تکه کد را که دارد به درستی کار می کند، بازنویسی کنید، سربار زیادی برای تولید، تست و کنترل کیفیت، از چند روز تا چند هفته باید به جان بخرید. تلاش برای بهینه سازی بیشتر یک پرس و جو که در حال حاضر کارایی نسبتا خوبی دارد، ممکن است بهبودی معادل ۳٪ داشته باید، اما برای رسیدن به این مقدار نسبتا بی ارزش، باید یک هفته تمام عرق بریزید.

هدف ما حل مسئله است، نه ایجاد مسئله در مسئله.

پرس و جو چه می کند؟

پرسش اولی که باید همیشه به دنبال پاسخ آن باشیم این است که: هدف این پرس و جو (Query) چیست؟

  • هدف مطلوب رسیدن به چیست؟
  • خروجی باید چه شکل و شمایلی داشته باشد؟
  • چه نیازی (کد، گزارش یا رابط کاربری) در پس پرده این پرس و جو قرار دارد؟

ما همیشه عادت داریم ظواهر کار را ببینیم و با عجله در پی رسیدن به نتیجه نهایی باشیم. ما یک Trace را اجرا کردیم، نقشه اجرای پرس و جو را در دست داریم و آمارهایی هم در خصوص IO و زمان بندی اجرا به دست آورده ایم، اما قبل از اینکه درک کنیم واقعا برای چه هدفی باید آماده باشیم، نمی توانیم آستین بالا بزنیم و انتظار رسیدنم به نتیجه مطلوب هم داشته باشیم.

گام اول در اجرای این پروژه ها، این است که کمی آرام بگیرید و ابتدا پرس و جو را درک کنید. برخی از سوالات مفید که می تواند به بهینه سازی کمک کند عبارتند از:

  • مجموعه نتایج خروجی چقدر است؟ آیا باید برای یک میلیون رکورد آماده باشیم، یا فقط چند رکورد را انتظار داریم؟
  • آیا پارامترهایی با مقادیر محدود وجود دارند؟ آیا یک پارامتر معین همیشه دارای همان مقدار ثابت خواهد بود، یا محدودیت های دیگری در مقادیر وجود دارد که بتواند کار ما را با از بین بردن برخی تستهای بیهوده، ساده کنند.
  • فرکانس اجرای این پرس و جو چقدر است؟ چیزی که روزانه یک بار اتفاق می افتد بسیار متفاوت از آنچه در هر ثانیه اجرا می شود مورد توجه قرار خواهد گرفت.
  • آیا مقادیر ورودی نامعتبر یا غیرمعمول وجود دارد که نشان دهنده یک مشکل در برنامه است؟ آیا ورودی امکان پذیرش مقدار NULL را دارد، اما هرگز نباید NULL باشد؟ آیا ترکیبی از ورودی ها محتمل هستند که معنا ندارند یا متناقض باشند، یا اصلا ارتباطی با تعریف مسئله نداشته باشند؟
  • آیا مشکل آشکار منطقی، نوشتاری یا بهینه سازی وجود دارد که در همان ابتدا به وضوح خود را نشان دهد؟ آیا مشکل بزرگ عملکردی را در همان نگاه اول مشاهده می کنیم که بدون در نظر گرفتن مقادیر پارامتر یا سایر متغیرها، همیشه باعث نمایش عملکرد ضعیفی باشد؟ بعداً در بخش تکنیکهای بهینه سازی، بیشتر درباره این موارد صحبت خواهیم کرد.
  • عملکرد قابل قبول برای این پرس و جو، چیست؟ برای رضایت کاربران، چقدر این پرس و جو باید سریع باشد؟ اگر عملکرد سرور ضعیف باشد، ما چقدر نیاز به کاهش مصرف منابع داریم تا کارایی قابل قبول باشد؟ در آخر، عملکرد فعلی پرس و جو چیست؟ این امر یک پایه را برای ما فراهم می کند، بنابراین می دانیم چه میزان پیشرفت مورد نیاز است.

با کمی مکث و پرسیدن این سؤالات قبل از شروع بهینه سازی یک پرس و جو، از وضعیت ناراحت کننده که در آن ساعت ها برای جمع آوری داده ها در مورد پرس و جو و صرفاً برای درک کامل نحوه استفاده از آن صرف می کنیم، جلوگیری خواهد شد. از هر جهت که به مسئله نگاه کنیم، کارهایی مثل بهینه سازی پرس و جو و طراحی پایگاه داده ما را مجبور می کند این سؤالات را بپرسیم.

نتایج این مکث و پرسش و پاسخ، اغلب ما را به سمت راه حل های خلاقانه تر سوق می دهد. شاید یک ایندکس جدید لازم نباشد و ما بتوانیم یک درخواست بزرگ را به چند مورد کوچکتر تجزیه کنیم. شاید یک مقدار پارامتر نادرست باشد و در کد یا UI مشکلی وجود دارد که باید برطرف شود. شاید یک هفته یک بار یک گزارش اجرا شود، بنابراین ما می توانیم مجموعه داده ها را از پیش ذخیره کنیم و نتایج را به یک ایمیل، داشبورد یا فایل بفرستیم، نه اینکه کاربر را مجبور کنیم ۱۰ دقیقه برای آن صبر کند.

ادامه دارد ….

جهت خواندن بخش دوم مقاله، اینجا کلیک کنید >>>

تغییر رویکرد سازمانی از پروژه محور به محصول محور: منظور چیست و چرا اهمیت دارد؟ - بخش دوم تغییر رویکرد سازمانی از پروژه محور به محصول محور: منظور چیست و چرا اهمیت دارد؟ - بخش اول
نظر خود را بگوئید

پیغام بگذارید

ایمیل شما با دیگران به اشتراک گذاشته نخواهد شد *

X

Hello,
Your location data will be used to help identify you and allow us to offer you great products and services. Your consent is important for us to do this and you are not obliged in any way to share this information with us. Thank you