آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server
مقدمه و مسئلهای که این موضوع حل میکند
آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server برای مشاهده Objectهای وابسته به یک Cached Plan و بررسی Cursor یا ساختارهای داخلی مرتبط استفاده میشود. این مقاله از تعریف پایه شروع میکند و سپس Scope، Queryهای تشخیصی، مثالهای قابل اجرا و تصمیمهای عملیاتی را بهصورت مرحلهای توضیح میدهد.
مخاطب اصلی Database Developer، DBA و مهندس Performance است. پیشنیاز، دسترسی خواندن Metadata و شناخت مقدماتی Execution Plan، DMVs و Transaction است. در پایان میتوانید تشخیص دهید چه زمانی sys.dm_exec_cached_plan_dependent_objects انتخاب مناسبی است و چه زمانی باید روش دیگری بهکار رود.
این موضوع بخشی از خانواده راهنمای جامع Plan Cache Commands و DMVs در SQL Server است. مسیر کامل مجموعه در مقاله مادر این خانواده قرار دارد.
دسترسی سریع
- تعریف و Scope موضوع
- Syntax یا روش Configuration
- منطق اجرا و کنترل State
- ده مثال عملی
- اشتباهات رایج و Performance
- Best Practices، FAQ و چکلیست
تعریف و جایگاه موضوع
sys.dm_exec_cached_plan_dependent_objects در SQL Server بهطور مشخص برای مشاهده Objectهای وابسته به یک Cached Plan و بررسی Cursor یا ساختارهای داخلی مرتبط بهکار میرود. جایگاه آن در چرخه Troubleshooting میان جمعآوری Evidence، تحلیل Root Cause، اجرای Change و کنترل نتیجه قرار میگیرد.
مفاهیم کلیدی این مقاله شامل plan_handle، memory_object_address، cache entries، dependent objects، cursor است. این مفاهیم باید در کنار هم دیده شوند؛ برای نمونه افزایش plan_handle بدون بررسی memory_object_address الزاماً نشانه مشکل یا موفقیت نیست.
این تصویر جایگاه آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server را میان اجزای مرتبط نشان میدهد و مشخص میکند plan_handle چگونه به memory_object_address و cache entries متصل میشود.
Scope، Permission و ستونهای کلیدی
این DMV یا View داده لحظهای یا تجمعی را از Engine ارائه میکند و معمولاً برای خواندن آن Permission سطح Server یا Database لازم است.
Syntax یا Query پایه
SELECT cp.plan_handle, d.*
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_cached_plan_dependent_objects(cp.plan_handle) AS d;
رفتارهای ویژه و محدودیت سازگاری
رفتار sys.dm_exec_cached_plan_dependent_objects ممکن است با Version، Edition، Compatibility Level و Permission تغییر کند. مقدار NULL، نبود داده، Restart سرویس، Eviction از Cache یا READ_ONLY شدن Query Store باید بهعنوان حالت معتبر در طراحی Query در نظر گرفته شود.
اجزای اصلی و منطق اجرا
Scope و داده مرجع
برای آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server نخست باید Scope اندازهگیری مشخص باشد. مشاهده Objectهای وابسته به یک Cached Plan و بررسی Cursor یا ساختارهای داخلی مرتبط بدون تعیین Database، Instance، Session یا Query هدف میتواند به نتیجهگیری نادرست منجر شود.
- ثبت plan_handle در Baseline
- تعیین ارتباط با memory_object_address
- مشخصکردن Reset Condition برای cache entries
معیار موفقیت و کنترل تغییر
معیار موفقیت باید قبل از اجرا نوشته شود؛ برای مثال کاهش Latency یا Logical Reads بدون افزایش Compile، Blocking یا I/O. dependent objects و cursor باید در گزارش Before/After حضور داشته باشند.
Audit و قابلیت بازبینی
زمان Capture، Login اجراکننده، نسخه SQL Server، Compatibility Level و Change Ticket را کنار نتیجه نگه دارید. این کار تحلیل Incident و انتقال دانش به تیم بعدی را قابلاعتماد میکند.
هشدار عملیاتی
این DMV به Plan Handle معتبر وابسته است و روی نسخهها یا انواع Plan مختلف خروجی یکسانی ندارد.
این جریان، مسیر واقعی از ورودی و State اولیه تا نتیجه قابلمشاهده در آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server را نمایش میدهد؛ نقاط کنترل plan_handle، memory_object_address و dependent objects در آن برجسته شدهاند.
مثالهای عملی از ساده تا پیشرفته
مثال 1: مشاهده خروجی پایه
اولین گام برای شناخت sys.dm_exec_cached_plan_dependent_objects مشاهده Snapshot فعلی و نام ستونها است.
SELECT TOP (20) *
FROM sys.dm_exec_cached_plan_dependent_objects;
| خروجی | تفسیر |
|---|
| 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_plan_dependent_objects')
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_plan_dependent_objects;
| خروجی | تفسیر |
|---|
| snapshot_rows | تعداد ردیف فعلی |
نکته عملی: این عدد بهتنهایی Metric Performance نیست؛ فقط حجم Snapshot را نشان میدهد.
مثال 5: نمونهبرداری تکرارشونده
دو Snapshot با فاصله کوتاه کمک میکند تغییرپذیری داده مشخص شود.
SELECT SYSDATETIME() AS captured_at, COUNT_BIG(*) AS snapshot_rows
FROM sys.dm_exec_cached_plan_dependent_objects;
WAITFOR DELAY '00:00:01';
SELECT SYSDATETIME() AS captured_at, COUNT_BIG(*) AS snapshot_rows
FROM sys.dm_exec_cached_plan_dependent_objects;
| خروجی | تفسیر |
|---|
| captured_at | زمان Capture |
| snapshot_rows | تعداد ردیف |
نکته عملی: در Job واقعی فاصله Capture را متناسب با نرخ تغییر Workload تعیین کنید.
مثال 6: ساخت Snapshot موقت
برای تحلیل بدون چندبار خواندن DMV، خروجی را در Temp Table نگه میداریم.
SELECT TOP (100) *
INTO #TopicSnapshot
FROM sys.dm_exec_cached_plan_dependent_objects;
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_plan_dependent_objects;
| خروجی | تفسیر |
|---|
| 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_plan_dependent_objects;
| خروجی | تفسیر |
|---|
| database_name | Database جاری |
| login_name | اجراکننده |
نکته عملی: ثبت Context برای Incident Review و مقایسه بین Environmentها ضروری است.
مثال 9: روش اشتباه و نسخه اصلاحشده
خواندن همه ستونها و همه ردیفها در Loop مانیتورینگ میتواند Overhead ایجاد کند.
-- روش نامناسب برای Polling پرتکرار:
-- SELECT * FROM sys.dm_exec_cached_plan_dependent_objects;
-- نسخه کنترلشده:
SELECT TOP (20) *
FROM sys.dm_exec_cached_plan_dependent_objects;
| خروجی | تفسیر |
|---|
| روش نامناسب | خروجی نامحدود |
| نسخه اصلاحشده | 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_plan_dependent_objects;
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
| خروجی | تفسیر |
|---|
| CPU time | در Messages |
| logical reads | در Messages |
نکته عملی: مانیتورینگ نباید خود به منبع مصرف CPU یا Contention تبدیل شود.
کاربردهای واقعی در پروژه
در پروژه واقعی، sys.dm_exec_cached_plan_dependent_objects زمانی ارزشمند است که به یک Runbook متصل شود. Trigger استفاده، Owner تصمیم، Query جمعآوری Evidence، مقدار Baseline، محدوده Change و معیار توقف باید پیش از Incident نوشته شده باشد.
برای Workload سازمانی میتوان خروجی plan_handle را با memory_object_address، Query Store، Extended Events و Metricهای سیستمعامل همبسته کرد. این همبستگی کمک میکند مشکل Application، Storage، Compile یا Concurrency با یک علامت منفرد اشتباه نشود.
اشتباهات رایج و روش اصلاح
- اقدام بر اساس یک Snapshot: راه اصلاح، Capture چندبازهای و مقایسه plan_handle با Baseline است.
- نادیدهگرفتن Scope: Database، Instance، Session یا Plan هدف را قبل از اجرای sys.dm_exec_cached_plan_dependent_objects مشخص کنید.
- اجرای Change بدون معیار موفقیت: CPU، Reads، Latency، Compile و Blocking را قبل و بعد ثبت کنید.
- فرض دائمیبودن Counterها: Restart، Eviction، Cleanup یا Reset میتواند تاریخچه memory_object_address را تغییر دهد.
- استفاده از 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_plan_dependent_objects در Repository دائمی ذخیره و گزارشگیری شود. روی جدول Snapshot، Columnهای زمان Capture، Database ID، Query ID یا Plan ID را متناسب با الگوی گزارش Index کنید؛ خود DMVها را نمیتوان Index کرد.
Best Practices
- Scope را کوچک و قابلاندازهگیری انتخاب کنید.
- قبل از تغییر، Baseline مربوط به plan_handle و memory_object_address را ذخیره کنید.
- Version، Edition و Compatibility Level را در Runbook بنویسید.
- Change را در Test یا Canary اجرا و سپس مرحلهای گسترش دهید.
- پس از اجرا، cache entries، dependent objects و Metricهای کاربر نهایی را دوباره اندازه بگیرید.
- برای عملیات برگشتناپذیر، Backup Evidence و تأیید دومرحلهای داشته باشید.
این پنل تصمیم نشان میدهد در سناریوی آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server چه زمانی مسیر پیشنهادی انتخاب شود، کجا Overhead یا ریسک افزایش مییابد و چگونه plan_handle با cursor سنجیده شود.
مزایا، محدودیتها و زمان نامناسب استفاده
| بُعد | توضیح تصمیممحور |
|---|
| مزیت | ایجاد Evidence دقیق برای مشاهده Objectهای وابسته به یک Cached Plan و بررسی Cursor یا ساختارهای داخلی مرتبط |
| محدودیت | وابستگی به Scope، Permission و State مربوط به plan_handle |
| زمان نامناسب | وقتی Baseline، Change Window یا امکان کنترل memory_object_address وجود ندارد |
| جایگزین مکمل | Query Store، Extended Events، Repository Snapshot و Monitoring سیستمعامل |
سؤالات متداول
آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server دقیقاً چه مسئلهای را حل میکند؟
مسئله اصلی، مشاهده Objectهای وابسته به یک Cached Plan و بررسی Cursor یا ساختارهای داخلی مرتبط است. ارزش واقعی زمانی ایجاد میشود که خروجی با Baseline و Context درست تفسیر شود.
برای شروع کار با آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server چه پیشنیازی لازم است؟
دسترسی مناسب، شناخت Scope، ثبت State اولیه و آشنایی با plan_handle و memory_object_address ضروری است.
آیا استفاده از آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server هزینه زیرساخت را کاهش میدهد؟
در صورت استفاده هدفمند، میتواند هزینه ناشی از CPU، I/O، Incident و زمان عیبیابی را کاهش دهد؛ نتیجه باید با Metric مالی و فنی سنجیده شود.
این موضوع برای پروژههای سازمانی چه ارزشی دارد؟
در پروژه سازمانی، استانداردسازی plan_handle و cache entries باعث Audit بهتر، تصمیم سریعتر و کاهش ریسک Change میشود.
آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server با روشهای جایگزین چه تفاوتی دارد؟
تفاوت اصلی در Scope، میزان جزئیات، اثر عملیاتی و قابلیت بازگشت است؛ انتخاب باید بر اساس سناریو باشد نه محبوبیت ابزار.
برای پیادهسازی حرفهای آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server میتوان از خدمات تخصصی استفاده کرد؟
بله، آموزش، مشاوره، طراحی Runbook و اجرای پروژه SQL Server میتواند متناسب با Workload و محدودیت سازمان انجام شود.
رایجترین خطا در استفاده از آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server چیست؟
رایجترین خطا، اقدام بدون Baseline و تفسیر جداگانه plan_handle بدون توجه به dependent objects است.
آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server چه اثری بر Performance دارد؟
اثر به نرخ اجرا، Scope و Workload وابسته است. CPU، Logical Reads، Compile، Blocking و Latency باید همزمان بررسی شوند.
Best Practice اصلی برای آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server چیست؟
با Scope کوچک شروع کنید، State را ثبت کنید، معیار موفقیت تعریف کنید و پس از تغییر، memory_object_address و cursor را دوباره اندازه بگیرید.
آیا آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server در همه نسخههای SQL Server یکسان است؟
خیر. Availability گزینهها، Permissionها، ستونها و رفتار ممکن است با Version، Edition و Compatibility Level تفاوت داشته باشد؛ محیط هدف را مستقیماً بررسی کنید.
سؤالات مصاحبه
- چگونه Scope و Reset Condition مربوط به آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server را توضیح میدهید؟
- برای اندازهگیری اثر آموزش جامع sys.dm_exec_cached_plan_dependent_objects در SQL Server چه Baseline و Metricهایی انتخاب میکنید؟
- تفاوت Diagnostic Action و Change Action در این موضوع چیست؟
- اگر plan_handle بهتر ولی memory_object_address بدتر شود، تصمیم شما چیست؟
- چه Rollback Plan و Audit Trail برای استفاده از آموزش جامع sys.dm_exec_cached_plan_dependent_objects در 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_plan_dependent_objects زمانی انتخاب مناسبی است که هدف شما مشاهده Objectهای وابسته به یک Cached Plan و بررسی Cursor یا ساختارهای داخلی مرتبط باشد و بتوانید Scope، Baseline و اثر تغییر را کنترل کنید. استفاده بدون Evidence یا تکرار مکانیکی Command میتواند نتیجه معکوس ایجاد کند.
قدم بعدی، مقایسه این موضوع با سایر اعضای راهنمای جامع Plan Cache Commands و DMVs در SQL Server و ساخت Runbook متناسب با Workload واقعی است.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان؛ قبول سفارشهای برنامهنویسی و پایگاه داده با شماره 09131253620.
انجام پروژه، آموزش برنامهنویسی و آموزش SQL Server توسط مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی تاکنون.
برای سفارش پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب و راهکارهای نرمافزاری با 09131253620 تماس بگیرید؛ ایتا، واتساپ و تماس مستقیم در دسترس است.
تماس با ما