Execution Plan چیست؟

ساخت وبلاگ

  

مفهوم Execution Plan

با توجه به این نکته که ما با مفاهیم برنامه نویسی آشنایی داریم، در ابتدا برای توضیح مفهوم execution plan از مروری بر فلوچارت استفاده می کنیم. در تصویر زیر یک نمونه فلوچارت ساده را مشاهده می کنید:

execution plan چیست

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

و اما  execution plan در sql server هم، یک مجموعه از اشکال گرافیکی(آیکن) هست که مراحل انجام شدن یک کوئری (select - update و...) رو نمایش میده (به همین سادگی!!!). در execution plan هم هر کدام از این شکل های گرافیکی که بهشون آیکن می گیم، نشان دهنده یک عملیات خاص ( خواندن از جدول - مرتب سازی و ...) هستند که مجموعه این عملیات، منجر به اجرای یک کوئری در sql server می شود. در شکل زیر یک نمونه از یک execution plan ساده رو می بینیم:

execution plan چیست

همونطور که مشاهده می کنید ما یک کوئری در sql server اجرا کرده ایم که از جدول Student نام و فامیل ها رو نمایش بدهد و خروجی را بر اساس نام مرتب سازی کند. خوب در تصویر گرافیکی بالا (از راست به چپ بخوانید) می بینیم که در ابتدا جدول خوانده شده است (Table Scan) و در مرحله بعدی یک مرتب سازی انجام شده (Sort) و در انتها هم رکوردهای مرتب شده جهت نمایش انتخاب می شوند (Select). پس در اجرا شدن کوئری مورد نظر ما از سه عملیات Table Scan - Sort - Select استفاده شده است. نکته مثبت دیگری  که در execution plan وجود داره متناسب بودن شکل ظاهری آیکن ها با عملیات مربوط به اون هست که در تصویر بالا به خوبی مشخص است.

پس با همین مثال ساده متوجه شدیم که تعریف execution plan چیست. علاوه بر این مفهوم سادگی رو که در ابتدای مطلب بهش اشاره کردیم به خوبی قابل مشاهده است (به دلیل استفاده از آیکن های با مفهوم)


نمایش Execution Plan در Sql server

در sql server بصورت پیش فرض با اجرا شدن کوئری execution plan نمایش داده نمی شود و می بایست این ویژگی رو فعال کنید. قبل از توضیح این مورد، بهتره بدونیم که در sql server دو نوع execution plan وجود داره:

  • Estimated Execution Plan: نمایش مراحل اجرای یک کوئری به صورت تخمینی - قبل از اجرا شدن واقعی کوئری

  • Actual Execution Plan: نمایش مراحل دقیق اجرا شدن کوئری - اجرا شدن واقعی کوئری

جهت نمایش execution plan روشهای مختلفی وجود داره ( کلید میانبر - منو - نوار ابزار) که در شکل زیر نحوه فعال سازی نمایشexecution plan رو با استفاده از آیکن های مربوطه در نوار ابزار می بینیم. (از کلیدهای میانبر نمایش داده شده در tooltip هم میتونین استفاده کنید). برای این کار، ابتدا یکی از این آیکن ها (Estimated /Actual) رو انتخاب و سپس کوئری مورد نظر رو اجرا می کنیم. (در صورت نیاز به مشاهده execution plan یک کوئری خاص، از بین چندین کوئری، تنها کافیست قبل از اجرا، کوئری مورد نظر را انتخاب(highlight) کنیم)

 نمایش execution plan در sqlserver

noticeنکته اول:  execution plan در سه قالب گرافیکی، Text و Xml قابل نمایش است که در روش بالا تنها روش فعال سازی نمایش گرافیکی آن را دیدیم. جهت فعال سازی دوحالت نمایش دیگر از دستورات زیر استفاده کنید:

فرمت های نمایش Execution plan

شاید این سؤال برای شما مطرح شود که کاربرد حالت های نمایشی text و xml چیست؟ به عنوان مثال شما در حالت نمایش xml، تگ های مختلفی را مشاهده می کنید که حاوی عملگرهای (آیکن ها) Execution plan نیز می باشد. اما سایر تگ های xml، حاوی اطلاعات مفیدی هستند که در مباحث افزایش سرعت اجرای کوئری و دیتابیس (performance tuning) از این اطلاعات جهت کشف مشکلات کارایی استفاده خواهیم کرد ( به عنوان مثال از تگ Internal info برای کشف Statistics های استفاده شده در اجرای یک کوئری استفاده می کنیم). به عنوان مثالی دیگر، از فرمت text آن در نرم افزار osql.exe استفاده می شود.

noticeنکته دوم: استفاده از فرمت sqlplan جهت ارسال Execution plan یک کوئری دارای مشکل کارایی به یک منخصص، جهت کشف مشکلات آن:

فرض کنید در سیستم لوکال خودتون یک کوئری رو اجرا می کنید که  مشکل کندی سرعت داره و لازم است که جهت رفع مشکل کارایی آن مشاوره دریافت کنید. خوب راه حل های مختلفی مانند انتقال بک آپ دیتابیس و کوئری مربوطه،ایجاد ارتباط با teamviewer و ... وجود دارد. اما یکی از بهترین روش ها، ذخیره Execution plan در قالب یک فایل و ارسال آن برای متخصص مورد نظر می باشد. این فایل که با فرمت sqlplan ذخیره می شود، بعد از باز کزدن در (ssms (sql server management studio سیستم مقصد، دقیقا شکل گرافیکی معادل در سیستم لوکال شما را نمایش خواهد داد. در شکل زیر نحوه ذخیره سازی یک Execution plan در فرمت sqlplan نمایش داده شده است.

execution-plan-sqlplan-format


عناصر تشکیل دهنده یک Execution Plan

مهمترین عناصری که در یک execution plan  وجود دارند عبارتند از:

1. آیکن ها: یک شکل گرافیکی هستند که معرف عملگری از Sql server می باشند. در ادامه در مورد انواع و دسته بندی آیکن ها صحبت خواهیم کرد.

2. Tooltip: با نگه داشتن موس روی عناصر execution plan (آیکن، فلش) نمایش داده می شوند و حاوی اطلاعات مفیدی هستند که در مباحث performance tuning زیاد از آن ها استفاده خواهیم کرد.

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

4. هزینه (cost): در زیر هر آیکن (عملگر) execution plan یک عدد همراه با علامت درصد(%) نوشته شده که معرف هزینه اجرایی آن عملگر است. 

noticeنکته: هزینه هر عملگر، بطور نسبی (Ratio) محاسبه می شود و میانگینی از I/O و مصرف منابع  (cpu، ram و ...) است. بنابراین مشاهده عدد صفر، در هزینه یک عملگر به این معنی است که هزینه این عملگر، به نسبت سایر عملگرهای موجود در execution plan ناچیز است و نه صفر.

5. ویژگی (properties): با راست کلیک کردن روی هر آیکن execution plan گزینه properties وجود دارد که اطلاعات تکمیلی در مورد آن عملگر را در اختیار ما قرار می دهد از این اطلاعات هم در فرآیند بهینه سازی و رفع مشکلات کارایی استفاده خواهیم کرد.

در شکل زیر، عناصر معرفی شده execution plan  همراه با شماره معادل آن در قسمت بالا، نمایش داده شده است:

 عناصر execution plan


آیکن های Execution Plan

یکی از اولین اجزاء یک  execution plan که همیشه با آن سر و کار داریم آیکن های موجود در آن یا همان شکل گرافیگی است و همانطورکه در مطالب قبلی اشاره شد با دنبال کردن این آیکن ها مراحل اجرا شدن یک کوئری در sql server رو متوجه خواهیم شد. اما تعداد آیکن های موجود در execution plan تقریبا 78 عدداست! البته در حالت معمول همواره تعداد کمی از این آیکن ها رو در execution plan خواهیم دید. این 78 آیکن(عملگر) در چهار گروه با سه رنگ بندی مختلف قرار می گیرند:

1. آیکن های سبز رنگ: این آیکن ها معرف عملگرهای عناصر زبان T-sql یا language element هستند. آیکن مربوط به عملگرهایی مانند: select- while- convert- assign- declare  و... در execution plan با رنگ سبز نمایش داده می شوند.

2. آیکن های آبی رنگ: نمایش دهنده عملیات دستکاری داده ها (DML) هستند و به آن ها logical-physical operator گفته می شود. این نوع آیکن ها بیشتر از بقیه در execution plan مشاهده می شود. عملیاتی مانند update- insert- table scan- delete و ... با آیکن هایی آبی رنگ در execution plan نمایش داده می شوند.

3. آیکن های زرد رنگ: بیانگر عملیات کرسر هستند. در واقع این دسته عملگرها Row Set هستند و روش کار آن ها به این صورت است که یک کرسر روی جدول تغریف می شود و یک رکورد در کرسر تعریفی واکشی شده و عملیات مورد نظر، روی آن یک رکورد انجام می شود و در ادامه رکورد بعدی واکشی می شود (fetch next) و تا آخرین رکورد جدول این روش ادامه پیدا می کند (انجام عملیا روی یک رکورد در لحظه). عملگرهای cursor- fetch query از این نوع هستند.

4. آیکن های آبی رنگ: در واقع این عملگرها زیر مجموعهای از عملگرهای logical-physical  هستند و مربوط به اجرای موازی یک عملیت می شوند که به آن ها را parallelism می نامند. عملگرهایی مانند distribute streams- gather streams با این آیکن آبی رنگ که به شکل چند فلش است نمایش داده می شوند.

 آیکن های execution plan به تفکیک رنگ

لازم است به این نکته اشاره کنم که نگران تعداد زیاد آیکن های execution plan نباشید. چون اولا همانطور که ذکر شد معمولا با تعداد محدودی از این آیکن ها(عملگرها) در اجرای کوئری ها سرو کار داریم و ثانیا شکل گرافیکی این آیکن ها بسیار شبیه به عملگر مربوط به آن هستند و به خوبی معرف عملیات انجام شده می باشند. در طول آموزش ها به تدریج و متناسب با موضوع، با این آیکن ها آشنا خواهیم شد.


کاربردهای Execution Plan

خوب تا اینجا با توضیحات داده شده ممکنه این سؤال پیش بیاد که مشاهده کردن execution plan و دیدن مراحل اجرا شدن یک کوئری چه کاربردی داره؟ برای پاسخ دادن به این سؤال، شرایط زیر رو در نظر بگیرید:

  • علی رغم وجود ایندکس برای فیلدهای موجود در شرط where کوئری، زمان اجرای آن طولانیه

  • وقتی که جداول رو با دیگر جداول جوین (join) می زنیم به شدت زمان اجرای کوئری افزایش پیدا می کنه

  • چه عملگر/هایی رو جایگزین عملگر/های موجود کنم تا سرعت اجرای بیشتری داشته باشم

  • آیا با تغییرات ایجاد شده در کوئری، اجرای بهتری نسبت به کوئری قبلی خواهیم داشت

  • آیا در کوئری طراحی شده، بازخوانی عملیات و یا تکرار شدن یک عملیات وجود دارد

  • آیا در عملیاتی مانند مرتب سازی(sort) و یا جوین(join) از حافظه جانبی استفاده می شود؟

   و ...

با اطلاعاتی که execution plan در اختیار ما قرار می دهد (آیکن ها - tooltip - اطلاعات (properties) هر عملگر و ...) می توانیم کلیه مشکلات بالا رو هندل کنیم. البته برای این منظور نیاز است که به تدریج و با تمرین، مهارت لازم برای این کار رو بدست بیاریم که در codeeatsleep با یک مجموعه آموزشی پیوسته به این هدف دست خواهیم یافت.

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

به عنوان جمع بندی:

امیدوارم که با مطالعه این مطلب، با اهمیت خاص execution plan و لزوم آشنایی با آن در توسعه برنامه های کاربردی و طراحی کوئری ها آشنایی پیدا کرده باشید. برای اینکه به تسلط لازم جهت به کارگیری execution plan در بهینه سازی برسیم لازم است که با انواع آیکن ها، نحوه خواندن، استخراج اطلاعات تکمیلی مورد نیاز از آن و تا حدودی با نقش optimizer در sql server آشنایی پیدا کنیم.

DBCC OPENTRAN...
ما را در سایت DBCC OPENTRAN دنبال می کنید

برچسب : نویسنده : fakhravary بازدید : 173 تاريخ : پنجشنبه 5 بهمن 1396 ساعت: 19:22