آموزش جامع sys.dm_exec_cached_plans در SQL Server
مقدمه و مسئلهای که این موضوع حل میکند
آموزش جامع sys.dm_exec_cached_plans در SQL Server برای مشاهده Cache Entryهای Plan Cache و تحلیل نوع Object، اندازه Plan و تعداد استفاده مجدد استفاده میشود. این مقاله از تعریف پایه شروع میکند و سپس Scope، Queryهای تشخیصی، مثالهای قابل اجرا و تصمیمهای عملیاتی را بهصورت مرحلهای توضیح میدهد.
مخاطب اصلی Database Developer، DBA و مهندس Performance است. پیشنیاز، دسترسی خواندن Metadata و شناخت مقدماتی Execution Plan، DMVs و Transaction است. در پایان میتوانید تشخیص دهید چه زمانی sys.dm_exec_cached_plans انتخاب مناسبی است و چه زمانی باید روش دیگری بهکار رود.
این موضوع بخشی از خانواده راهنمای جامع Plan Cache Commands و DMVs در SQL Server است. مسیر کامل مجموعه در مقاله مادر این خانواده قرار دارد.
دسترسی سریع
- تعریف و Scope موضوع
- Syntax یا روش Configuration
- منطق اجرا و کنترل State
- ده مثال عملی
- اشتباهات رایج و Performance
- Best Practices، FAQ و چکلیست
تعریف و جایگاه موضوع
sys.dm_exec_cached_plans در SQL Server بهطور مشخص برای مشاهده Cache Entryهای Plan Cache و تحلیل نوع Object، اندازه Plan و تعداد استفاده مجدد بهکار میرود. جایگاه آن در چرخه Troubleshooting میان جمعآوری Evidence، تحلیل Root Cause، اجرای Change و کنترل نتیجه قرار میگیرد.
مفاهیم کلیدی این مقاله شامل cacheobjtype، objtype، usecounts، size_in_bytes، plan_handle است. این مفاهیم باید در کنار هم دیده شوند؛ برای نمونه افزایش cacheobjtype بدون بررسی objtype الزاماً نشانه مشکل یا موفقیت نیست.
این تصویر جایگاه آموزش جامع sys.dm_exec_cached_plans در SQL Server را میان اجزای مرتبط نشان میدهد و مشخص میکند cacheobjtype چگونه به objtype و usecounts متصل میشود.
Scope، Permission و ستونهای کلیدی
این DMV یا View داده لحظهای یا تجمعی را از Engine ارائه میکند و معمولاً برای خواندن آن Permission سطح Server یا Database لازم است.
Syntax یا Query پایه
SELECT TOP (50) *
FROM sys.dm_exec_cached_plans;
رفتارهای ویژه و محدودیت سازگاری
رفتار sys.dm_exec_cached_plans ممکن است با Version، Edition، Compatibility Level و Permission تغییر کند. مقدار NULL، نبود داده، Restart سرویس، Eviction از Cache یا READ_ONLY شدن Query Store باید بهعنوان حالت معتبر در طراحی Query در نظر گرفته شود.
اجزای اصلی و منطق اجرا
Scope و داده مرجع
برای آموزش جامع sys.dm_exec_cached_plans در SQL Server نخست باید Scope اندازهگیری مشخص باشد. مشاهده Cache Entryهای Plan Cache و تحلیل نوع Object، اندازه Plan و تعداد استفاده مجدد بدون تعیین Database، Instance، Session یا Query هدف میتواند به نتیجهگیری نادرست منجر شود.
- ثبت cacheobjtype در Baseline
- تعیین ارتباط با objtype
- مشخصکردن Reset Condition برای usecounts
معیار موفقیت و کنترل تغییر
معیار موفقیت باید قبل از اجرا نوشته شود؛ برای مثال کاهش Latency یا Logical Reads بدون افزایش Compile، Blocking یا I/O. size_in_bytes و plan_handle باید در گزارش Before/After حضور داشته باشند.
Audit و قابلیت بازبینی
زمان Capture، Login اجراکننده، نسخه SQL Server، Compatibility Level و Change Ticket را کنار نتیجه نگه دارید. این کار تحلیل Incident و انتقال دانش به تیم بعدی را قابلاعتماد میکند.
هشدار عملیاتی
خواندن این DMV کمخطر است، اما تفسیر حجم Cache بدون درنظرگرفتن Memory Pressure میتواند نتیجه اشتباه ایجاد کند.
این جریان، مسیر واقعی از ورودی و State اولیه تا نتیجه قابلمشاهده در آموزش جامع sys.dm_exec_cached_plans در SQL Server را نمایش میدهد؛ نقاط کنترل cacheobjtype، objtype و size_in_bytes در آن برجسته شدهاند.
مثالهای عملی از ساده تا پیشرفته
مثال 1: مشاهده خروجی پایه
اولین گام برای شناخت sys.dm_exec_cached_plans مشاهده Snapshot فعلی و نام ستونها است.
SELECT TOP (20) *
FROM sys.dm_exec_cached_plans;
| خروجی | تفسیر |
|---|
| Scope | Snapshot فعلی |
| Rows | حداکثر 20 ردیف |
نکته عملی: این Query نقطه شروع است؛ پیش از ساخت Alert باید ستونها و Scope واقعی در نسخه نصبشده بررسی شود.
مثال 2: بررسی Metadata ستونها
برای نوشتن Query پایدار، نوع داده و نام ستونهای DMV را از Metadata استخراج میکنیم.
SELECT c.column_id, c.name, TYPE_NAME(c.user_type_id) AS data_type
FROM sys.all_columns AS c
WHERE c.object_id = OBJECT_ID(N'sys.dm_exec_cached_plans')
ORDER BY c.column_id;
| خروجی | تفسیر |
|---|
| column_id | ترتیب ستون |
| data_type | نوع داده |
نکته عملی: این روش از حدسزدن نوع ستون جلوگیری میکند و برای مستندسازی نسخههای مختلف مناسب است.
مثال 3: کنترل Permission
قبل از اجرای مانیتورینگ در Production باید Permission حساب سرویس مشخص شود.
SELECT
HAS_PERMS_BY_NAME(NULL, NULL, N'VIEW SERVER STATE') AS HasViewServerState,
HAS_PERMS_BY_NAME(DB_NAME(), N'DATABASE', N'VIEW DATABASE STATE') AS HasViewDatabaseState;
| خروجی | تفسیر |
|---|
| HasViewServerState | 0 یا 1 |
| HasViewDatabaseState | 0 یا 1 |
نکته عملی: Permission را حداقلی نگه دارید و از اجرای Job با حساب sysadmin فقط برای رفع خطای دسترسی پرهیز کنید.
مثال 4: شمارش Snapshot
تعداد ردیفها یک Baseline ساده برای مقایسه تغییرات بعدی ایجاد میکند.
SELECT COUNT_BIG(*) AS snapshot_rows
FROM sys.dm_exec_cached_plans;
| خروجی | تفسیر |
|---|
| snapshot_rows | تعداد ردیف فعلی |
نکته عملی: این عدد بهتنهایی Metric Performance نیست؛ فقط حجم Snapshot را نشان میدهد.
مثال 5: نمونهبرداری تکرارشونده
دو Snapshot با فاصله کوتاه کمک میکند تغییرپذیری داده مشخص شود.
SELECT SYSDATETIME() AS captured_at, COUNT_BIG(*) AS snapshot_rows
FROM sys.dm_exec_cached_plans;
WAITFOR DELAY '00:00:01';
SELECT SYSDATETIME() AS captured_at, COUNT_BIG(*) AS snapshot_rows
FROM sys.dm_exec_cached_plans;
| خروجی | تفسیر |
|---|
| captured_at | زمان Capture |
| snapshot_rows | تعداد ردیف |
نکته عملی: در Job واقعی فاصله Capture را متناسب با نرخ تغییر Workload تعیین کنید.
مثال 6: ساخت Snapshot موقت
برای تحلیل بدون چندبار خواندن DMV، خروجی را در Temp Table نگه میداریم.
SELECT TOP (100) *
INTO #TopicSnapshot
FROM sys.dm_exec_cached_plans;
SELECT COUNT_BIG(*) AS captured_rows
FROM #TopicSnapshot;
| خروجی | تفسیر |
|---|
| captured_rows | تعداد ردیف ذخیرهشده |
نکته عملی: Snapshot موقت Consistency تحلیل را بهتر میکند، ولی TempDB مصرف میکند.
مثال 7: تشخیص Reset یا Eviction
زمان Start سرویس را کنار Snapshot ثبت میکنیم تا Reset شدن Counterها قابل تفسیر باشد.
SELECT sqlserver_start_time
FROM sys.dm_os_sys_info;
SELECT COUNT_BIG(*) AS snapshot_rows
FROM sys.dm_exec_cached_plans;
| خروجی | تفسیر |
|---|
| sqlserver_start_time | مبدأ Counterها |
| snapshot_rows | وضعیت فعلی |
نکته عملی: بعد از Restart یا Eviction، مقایسه با Baseline قدیمی معتبر نیست.
مثال 8: گزارش قابل Audit
خروجی را با Context Database و Login ثبت میکنیم تا منبع Snapshot معلوم باشد.
SELECT DB_NAME() AS database_name, ORIGINAL_LOGIN() AS login_name, SYSDATETIME() AS captured_at;
SELECT TOP (10) *
FROM sys.dm_exec_cached_plans;
| خروجی | تفسیر |
|---|
| database_name | Database جاری |
| login_name | اجراکننده |
نکته عملی: ثبت Context برای Incident Review و مقایسه بین Environmentها ضروری است.
مثال 9: روش اشتباه و نسخه اصلاحشده
خواندن همه ستونها و همه ردیفها در Loop مانیتورینگ میتواند Overhead ایجاد کند.
-- روش نامناسب برای Polling پرتکرار:
-- SELECT * FROM sys.dm_exec_cached_plans;
-- نسخه کنترلشده:
SELECT TOP (20) *
FROM sys.dm_exec_cached_plans;
| خروجی | تفسیر |
|---|
| روش نامناسب | خروجی نامحدود |
| نسخه اصلاحشده | TOP و Interval مشخص |
نکته عملی: ستونهای لازم را صریح انتخاب کنید و Polling Interval را از نیاز عملی استخراج کنید.
مثال 10: اندازهگیری هزینه Query مانیتورینگ
برای ارزیابی Overhead خود Query مانیتورینگ، Statistics IO و Time فعال میشود.
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT TOP (50) *
FROM sys.dm_exec_cached_plans;
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
| خروجی | تفسیر |
|---|
| CPU time | در Messages |
| logical reads | در Messages |
نکته عملی: مانیتورینگ نباید خود به منبع مصرف CPU یا Contention تبدیل شود.
کاربردهای واقعی در پروژه
در پروژه واقعی، sys.dm_exec_cached_plans زمانی ارزشمند است که به یک Runbook متصل شود. Trigger استفاده، Owner تصمیم، Query جمعآوری Evidence، مقدار Baseline، محدوده Change و معیار توقف باید پیش از Incident نوشته شده باشد.
برای Workload سازمانی میتوان خروجی cacheobjtype را با objtype، Query Store، Extended Events و Metricهای سیستمعامل همبسته کرد. این همبستگی کمک میکند مشکل Application، Storage، Compile یا Concurrency با یک علامت منفرد اشتباه نشود.
اشتباهات رایج و روش اصلاح
- اقدام بر اساس یک Snapshot: راه اصلاح، Capture چندبازهای و مقایسه cacheobjtype با Baseline است.
- نادیدهگرفتن Scope: Database، Instance، Session یا Plan هدف را قبل از اجرای sys.dm_exec_cached_plans مشخص کنید.
- اجرای Change بدون معیار موفقیت: CPU، Reads، Latency، Compile و Blocking را قبل و بعد ثبت کنید.
- فرض دائمیبودن Counterها: Restart، Eviction، Cleanup یا Reset میتواند تاریخچه objtype را تغییر دهد.
- استفاده از Permission بیش از نیاز: دسترسی حداقلی و حساب سرویس مجزا برای مانیتورینگ تعریف کنید.
Performance Considerations
هزینه اصلی در این موضوع به نرخ Polling، حجم خروجی، Compile، I/O و Scope Change وابسته است. Query مانیتورینگ باید فقط ستونهای لازم را بخواند و از SELECT ستاره در Loop پرتکرار دوری کند. برای Changeهای Cache یا Query Store، اثر روی CPU و Latency بعد از تغییر باید در Window کوتاه کنترل شود.
SARGability و Index زمانی مهم میشوند که داده sys.dm_exec_cached_plans در Repository دائمی ذخیره و گزارشگیری شود. روی جدول Snapshot، Columnهای زمان Capture، Database ID، Query ID یا Plan ID را متناسب با الگوی گزارش Index کنید؛ خود DMVها را نمیتوان Index کرد.
Best Practices
- Scope را کوچک و قابلاندازهگیری انتخاب کنید.
- قبل از تغییر، Baseline مربوط به cacheobjtype و objtype را ذخیره کنید.
- Version، Edition و Compatibility Level را در Runbook بنویسید.
- Change را در Test یا Canary اجرا و سپس مرحلهای گسترش دهید.
- پس از اجرا، usecounts، size_in_bytes و Metricهای کاربر نهایی را دوباره اندازه بگیرید.
- برای عملیات برگشتناپذیر، Backup Evidence و تأیید دومرحلهای داشته باشید.
این پنل تصمیم نشان میدهد در سناریوی آموزش جامع sys.dm_exec_cached_plans در SQL Server چه زمانی مسیر پیشنهادی انتخاب شود، کجا Overhead یا ریسک افزایش مییابد و چگونه cacheobjtype با plan_handle سنجیده شود.
مزایا، محدودیتها و زمان نامناسب استفاده
| بُعد | توضیح تصمیممحور |
|---|
| مزیت | ایجاد Evidence دقیق برای مشاهده Cache Entryهای Plan Cache و تحلیل نوع Object، اندازه Plan و تعداد استفاده مجدد |
| محدودیت | وابستگی به Scope، Permission و State مربوط به cacheobjtype |
| زمان نامناسب | وقتی Baseline، Change Window یا امکان کنترل objtype وجود ندارد |
| جایگزین مکمل | Query Store، Extended Events، Repository Snapshot و Monitoring سیستمعامل |
سؤالات متداول
آموزش جامع sys.dm_exec_cached_plans در SQL Server دقیقاً چه مسئلهای را حل میکند؟
مسئله اصلی، مشاهده Cache Entryهای Plan Cache و تحلیل نوع Object، اندازه Plan و تعداد استفاده مجدد است. ارزش واقعی زمانی ایجاد میشود که خروجی با Baseline و Context درست تفسیر شود.
برای شروع کار با آموزش جامع sys.dm_exec_cached_plans در SQL Server چه پیشنیازی لازم است؟
دسترسی مناسب، شناخت Scope، ثبت State اولیه و آشنایی با cacheobjtype و objtype ضروری است.
آیا استفاده از آموزش جامع sys.dm_exec_cached_plans در SQL Server هزینه زیرساخت را کاهش میدهد؟
در صورت استفاده هدفمند، میتواند هزینه ناشی از CPU، I/O، Incident و زمان عیبیابی را کاهش دهد؛ نتیجه باید با Metric مالی و فنی سنجیده شود.
این موضوع برای پروژههای سازمانی چه ارزشی دارد؟
در پروژه سازمانی، استانداردسازی cacheobjtype و usecounts باعث Audit بهتر، تصمیم سریعتر و کاهش ریسک Change میشود.
آموزش جامع sys.dm_exec_cached_plans در SQL Server با روشهای جایگزین چه تفاوتی دارد؟
تفاوت اصلی در Scope، میزان جزئیات، اثر عملیاتی و قابلیت بازگشت است؛ انتخاب باید بر اساس سناریو باشد نه محبوبیت ابزار.
برای پیادهسازی حرفهای آموزش جامع sys.dm_exec_cached_plans در SQL Server میتوان از خدمات تخصصی استفاده کرد؟
بله، آموزش، مشاوره، طراحی Runbook و اجرای پروژه SQL Server میتواند متناسب با Workload و محدودیت سازمان انجام شود.
رایجترین خطا در استفاده از آموزش جامع sys.dm_exec_cached_plans در SQL Server چیست؟
رایجترین خطا، اقدام بدون Baseline و تفسیر جداگانه cacheobjtype بدون توجه به size_in_bytes است.
آموزش جامع sys.dm_exec_cached_plans در SQL Server چه اثری بر Performance دارد؟
اثر به نرخ اجرا، Scope و Workload وابسته است. CPU، Logical Reads، Compile، Blocking و Latency باید همزمان بررسی شوند.
Best Practice اصلی برای آموزش جامع sys.dm_exec_cached_plans در SQL Server چیست؟
با Scope کوچک شروع کنید، State را ثبت کنید، معیار موفقیت تعریف کنید و پس از تغییر، objtype و plan_handle را دوباره اندازه بگیرید.
آیا آموزش جامع sys.dm_exec_cached_plans در SQL Server در همه نسخههای SQL Server یکسان است؟
خیر. Availability گزینهها، Permissionها، ستونها و رفتار ممکن است با Version، Edition و Compatibility Level تفاوت داشته باشد؛ محیط هدف را مستقیماً بررسی کنید.
سؤالات مصاحبه
- چگونه Scope و Reset Condition مربوط به آموزش جامع sys.dm_exec_cached_plans در SQL Server را توضیح میدهید؟
- برای اندازهگیری اثر آموزش جامع sys.dm_exec_cached_plans در SQL Server چه Baseline و Metricهایی انتخاب میکنید؟
- تفاوت Diagnostic Action و Change Action در این موضوع چیست؟
- اگر cacheobjtype بهتر ولی objtype بدتر شود، تصمیم شما چیست؟
- چه Rollback Plan و Audit Trail برای استفاده از آموزش جامع sys.dm_exec_cached_plans در SQL Server تعریف میکنید؟
چکلیست نهایی
- Database و Instance هدف را تأیید کنید.
- Permission لازم را بدون افزایش دائمی Role بررسی کنید.
- Baseline و زمان شروع اندازهگیری را ذخیره کنید.
- Query یا Command را ابتدا با Scope محدود اجرا کنید.
- Output، Messages و Errorها را در Change Log ثبت کنید.
- Metricهای Before/After را با SLA مقایسه کنید.
- در صورت Regression، Rollback یا توقف مرحله بعد را اجرا کنید.
- نتیجه و درسآموخته را در Runbook خانواده ثبت کنید.
جمعبندی
sys.dm_exec_cached_plans زمانی انتخاب مناسبی است که هدف شما مشاهده Cache Entryهای Plan Cache و تحلیل نوع Object، اندازه Plan و تعداد استفاده مجدد باشد و بتوانید Scope، Baseline و اثر تغییر را کنترل کنید. استفاده بدون Evidence یا تکرار مکانیکی Command میتواند نتیجه معکوس ایجاد کند.
قدم بعدی، مقایسه این موضوع با سایر اعضای راهنمای جامع Plan Cache Commands و DMVs در SQL Server و ساخت Runbook متناسب با Workload واقعی است.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان؛ قبول سفارشهای برنامهنویسی و پایگاه داده با شماره 09131253620.
انجام پروژه، آموزش برنامهنویسی و آموزش SQL Server توسط مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی تاکنون.
برای سفارش پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب و راهکارهای نرمافزاری با 09131253620 تماس بگیرید؛ ایتا، واتساپ و تماس مستقیم در دسترس است.
تماس با ما