راهنمای جامع DMVهای اجرای Query در SQL Server
Dynamic Management Views و Dynamic Management Functions مرتبط با Execution، یکی از مهمترین ابزارهای DBA و توسعهدهنده برای دیدن رفتار داخلی موتور SQL Server هستند. با این مجموعه میتوان درخواستهای فعال، Sessionها، Connectionها، آمار Query و Procedure، Plan Cache، Cursorها و برخی قابلیتهای تخصصی اجرای توزیعشده را بررسی کرد.
هدف این مقاله ایجاد یک نقشه راه عملی است: بدانیم هر DMV چه سؤال مشخصی را پاسخ میدهد، چه زمانی باید از آن استفاده کنیم و چگونه خروجی چند DMV را کنار هم قرار دهیم. لینک هر موضوع به مقاله مستقل و مفصل همان DMV متصل است و همه لینکها بهصورت Root-relative ساخته شدهاند.
برای Troubleshooting حرفهای، یک DMV بهتنهایی کافی نیست. مسئله را از Request و Session شروع کنید، سپس Query Text، Plan، آمار تجمعی، Waitها و Context سیستم را به هم مرتبط کنید.
دسترسی سریع
مدل ذهنی: Connection، Session، Request و Plan
در یک زنجیره ساده، Connection کانال ارتباطی کلاینت با Database Engine است، Session Context احراز هویت و تنظیمات کاربر را نگه میدارد و Request واحد کاری در حال اجرای فعلی است. در کنار آن، Plan Cache و آمار تجمعی به ما میگویند Queryها و Moduleهای کششده در طول عمر Plan چه رفتاری داشتهاند.
این تفکیک مهم است؛ چون یک Session میتواند در لحظه Request فعال نداشته باشد، یک Connection ممکن است چند مفهوم شبکهای را آشکار کند و آمار Query Cache ممکن است پس از Recompile یا Eviction از بین برود. بنابراین Scope و Lifetime هر منبع داده را قبل از تحلیل بشناسید.
دستهبندی DMVهای این مجموعه
۱. فعالیت زنده: Request، Session و Connection
sys.dm_exec_requests برای Requestهای در حال اجرا، sys.dm_exec_sessions برای Context نشستها و sys.dm_exec_connections برای جزئیات اتصال و شبکه به کار میروند. کنار هم قراردادن این سه منبع، نقطه شروع بسیار خوبی برای بررسی Blocking، Sessionهای Sleeping و مشکلات اتصال است.
۲. آمار تجمعی Query و Module
sys.dm_exec_query_stats آمار Statementهای دارای Plan کششده را ارائه میکند. sys.dm_exec_procedure_stats، sys.dm_exec_function_stats و sys.dm_exec_trigger_stats دید Module-level میدهند و برای یافتن اشیای پرتکرار یا پرهزینه مفیدند.
۳. Plan Cache و Cursor
sys.dm_exec_cached_plans ساختار کلی Plan Cache، اندازه و میزان reuse را نشان میدهد. sys.dm_exec_cursors نیز برای مشاهده Cursorهای Sessionها و شناسایی Cursorهای باز یا طولانی کاربرد دارد.
۴. Background، External و Distributed Execution
برخی DMVهای این مجموعه برای زیرسیستمهای تخصصیتر، نسخهها یا معماریهای توزیعشده طراحی شدهاند. پیش از استفاده باید وجود Object، ستونها و پلتفرم پشتیبانیشده را کنترل کرد؛ زیرا SQL Server تکگرهی، Azure SQL، Synapse، Fabric و سایر محصولات لزوماً Scope یکسان ندارند.
sys.dm_exec_requests — درخواستهای فعال SQL Server
نمایش درخواستهایی که هماکنون در حال اجرا هستند؛ مناسب برای بررسی وضعیت اجرا، انتظارها، CPU، زمان سپریشده و Blocking. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «درخواستهای فعال SQL Server» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_requests با مثالهای عملی
sys.dm_exec_sessions — نشستهای فعال و احراز هویتشده
نمایش نشستهای کاربری و داخلی و اطلاعاتی مانند Login، برنامه کلاینت، وضعیت نشست، مصرف منابع و تراکنشهای باز. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «نشستهای فعال و احراز هویتشده» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_sessions با مثالهای عملی
sys.dm_exec_connections — اتصالهای شبکه و پروتکل
نمایش اتصالهای برقرارشده به Database Engine و جزئیات شبکه، زمان اتصال، روش احراز هویت و ارتباط اتصال با Session. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «اتصالهای شبکه و پروتکل» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_connections با مثالهای عملی
sys.dm_exec_query_stats — آمار تجمعی اجرای Queryهای کششده
ارائه آمار تجمعی Statementهای دارای Plan کششده؛ از مهمترین منابع برای یافتن Queryهای پرهزینه از نظر CPU، زمان، Reads و Writes. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «آمار تجمعی اجرای Queryهای کششده» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_query_stats با مثالهای عملی
sys.dm_exec_procedure_stats — آمار اجرای Stored Procedureها
ارائه آمار تجمعی Procedureهای کششده برای تحلیل تعداد اجرا، CPU، زمان، Reads، Writes و آخرین اجرای هر Procedure. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «آمار اجرای Stored Procedureها» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_procedure_stats با مثالهای عملی
sys.dm_exec_function_stats — آمار اجرای Functionها
ارائه آمار تجمعی اجرای Functionهای کششده در محیطهای پشتیبانیشده و کمک به شناسایی توابع پرهزینه. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «آمار اجرای Functionها» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_function_stats با مثالهای عملی
sys.dm_exec_trigger_stats — آمار اجرای Triggerها
ارائه آمار تجمعی Triggerهای کششده برای بررسی تعداد اجرا، زمان، CPU و هزینه Triggerهایی که ممکن است پنهانی روی DML اثر بگذارند. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «آمار اجرای Triggerها» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_trigger_stats با مثالهای عملی
sys.dm_exec_cached_plans — Planهای موجود در Plan Cache
نمایش یک ردیف برای هر Plan کششده و اطلاعاتی مانند تعداد استفاده، اندازه، نوع شیء و Plan Handle؛ مناسب برای تحلیل Plan Cache. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «Planهای موجود در Plan Cache» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_cached_plans با مثالهای عملی
sys.dm_exec_cursors — Cursorهای باز و فعال
تابع مدیریت پویا برای مشاهده Cursorهای یک Session یا همه Sessionها و تحلیل Cursorهای طولانی، بازمانده یا پرهزینه. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «Cursorهای باز و فعال» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_cursors با مثالهای عملی
sys.dm_exec_background_job_queue — صف کارهای پسزمینه Execution
نمایش اطلاعات صف کارهای پسزمینه مرتبط با زیرسیستم اجرای Query در محیطها و نسخههای پشتیبانیشده؛ ساختار دقیق باید با نسخه مقصد کنترل شود. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «صف کارهای پسزمینه Execution» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_background_job_queue با مثالهای عملی
sys.dm_exec_background_job_queue_stats — آمار صف کارهای پسزمینه
ارائه آمار مرتبط با Background Job Queue در محیطهای پشتیبانیشده و کمک به مشاهده رفتار تجمعی صفهای داخلی. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «آمار صف کارهای پسزمینه» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_background_job_queue_stats با مثالهای عملی
sys.dm_exec_external_operations — عملیات خارجی Query
نمایش اطلاعات عملیات خارجی در سناریوهای پشتیبانیشده مانند پردازشهای توزیعشده یا External Data؛ در دسترسبودن ستونها وابسته به محصول و نسخه است. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «عملیات خارجی Query» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_external_operations با مثالهای عملی
sys.dm_exec_external_work — کارهای خارجی Execution
نمایش Workهای خارجی مرتبط با اجرای توزیعشده در محیطهای پشتیبانیشده؛ برای عیبیابی باید همراه DMVهای همان پلتفرم تحلیل شود. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «کارهای خارجی Execution» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_external_work با مثالهای عملی
sys.dm_exec_compute_nodes — گرههای محاسباتی
نمایش اطلاعات Compute Nodeها در معماریهای توزیعشده و محیطهای پشتیبانیشده؛ برای SQL Server تکگرهی معمولاً کاربرد روزمره ندارد. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «گرههای محاسباتی» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_compute_nodes با مثالهای عملی
sys.dm_exec_distributed_requests — درخواستهای توزیعشده
نمایش اطلاعات درخواستهای توزیعشده در پلتفرمهای پشتیبانیشده و کمک به ردیابی مراحل اجرای Query در معماری چندگرهی. این DMV را زمانی انتخاب کنید که سؤال عملیاتی شما مستقیماً به «درخواستهای توزیعشده» مربوط باشد. برای Queryهای نمونه، محدودیتها، Performance Considerations و سناریوهای عیبیابی، مقاله اختصاصی را مطالعه کنید.
آموزش کامل sys.dm_exec_distributed_requests با مثالهای عملی
جدول مقایسهای DMVها
| تابع/DMV | کاربرد اصلی | نوع خروجی یا نکته مهم | لینک آموزش کامل |
|---|
| sys.dm_exec_requests | درخواستهای فعال SQL Server | نمایش درخواستهایی که هماکنون در حال اجرا هستند؛ مناسب برای بررسی وضعیت اجرا، انتظارها، CPU، زمان سپریشده و Blocking. | آموزش کامل |
| sys.dm_exec_sessions | نشستهای فعال و احراز هویتشده | نمایش نشستهای کاربری و داخلی و اطلاعاتی مانند Login، برنامه کلاینت، وضعیت نشست، مصرف منابع و تراکنشهای باز. | آموزش کامل |
| sys.dm_exec_connections | اتصالهای شبکه و پروتکل | نمایش اتصالهای برقرارشده به Database Engine و جزئیات شبکه، زمان اتصال، روش احراز هویت و ارتباط اتصال با Session. | آموزش کامل |
| sys.dm_exec_query_stats | آمار تجمعی اجرای Queryهای کششده | ارائه آمار تجمعی Statementهای دارای Plan کششده؛ از مهمترین منابع برای یافتن Queryهای پرهزینه از نظر CPU، زمان، Reads و Writes. | آموزش کامل |
| sys.dm_exec_procedure_stats | آمار اجرای Stored Procedureها | ارائه آمار تجمعی Procedureهای کششده برای تحلیل تعداد اجرا، CPU، زمان، Reads، Writes و آخرین اجرای هر Procedure. | آموزش کامل |
| sys.dm_exec_function_stats | آمار اجرای Functionها | ارائه آمار تجمعی اجرای Functionهای کششده در محیطهای پشتیبانیشده و کمک به شناسایی توابع پرهزینه. | آموزش کامل |
| sys.dm_exec_trigger_stats | آمار اجرای Triggerها | ارائه آمار تجمعی Triggerهای کششده برای بررسی تعداد اجرا، زمان، CPU و هزینه Triggerهایی که ممکن است پنهانی روی DML اثر بگذارند. | آموزش کامل |
| sys.dm_exec_cached_plans | Planهای موجود در Plan Cache | نمایش یک ردیف برای هر Plan کششده و اطلاعاتی مانند تعداد استفاده، اندازه، نوع شیء و Plan Handle؛ مناسب برای تحلیل Plan Cache. | آموزش کامل |
| sys.dm_exec_cursors | Cursorهای باز و فعال | تابع مدیریت پویا برای مشاهده Cursorهای یک Session یا همه Sessionها و تحلیل Cursorهای طولانی، بازمانده یا پرهزینه. | آموزش کامل |
| sys.dm_exec_background_job_queue | صف کارهای پسزمینه Execution | نمایش اطلاعات صف کارهای پسزمینه مرتبط با زیرسیستم اجرای Query در محیطها و نسخههای پشتیبانیشده؛ ساختار دقیق باید با نسخه مقصد کنترل شود. | آموزش کامل |
| sys.dm_exec_background_job_queue_stats | آمار صف کارهای پسزمینه | ارائه آمار مرتبط با Background Job Queue در محیطهای پشتیبانیشده و کمک به مشاهده رفتار تجمعی صفهای داخلی. | آموزش کامل |
| sys.dm_exec_external_operations | عملیات خارجی Query | نمایش اطلاعات عملیات خارجی در سناریوهای پشتیبانیشده مانند پردازشهای توزیعشده یا External Data؛ در دسترسبودن ستونها وابسته به محصول و نسخه است. | آموزش کامل |
| sys.dm_exec_external_work | کارهای خارجی Execution | نمایش Workهای خارجی مرتبط با اجرای توزیعشده در محیطهای پشتیبانیشده؛ برای عیبیابی باید همراه DMVهای همان پلتفرم تحلیل شود. | آموزش کامل |
| sys.dm_exec_compute_nodes | گرههای محاسباتی | نمایش اطلاعات Compute Nodeها در معماریهای توزیعشده و محیطهای پشتیبانیشده؛ برای SQL Server تکگرهی معمولاً کاربرد روزمره ندارد. | آموزش کامل |
| sys.dm_exec_distributed_requests | درخواستهای توزیعشده | نمایش اطلاعات درخواستهای توزیعشده در پلتفرمهای پشتیبانیشده و کمک به ردیابی مراحل اجرای Query در معماری چندگرهی. | آموزش کامل |
مثالهای ترکیبی و کاربردی
مثال شماره 1: مشاهده Request و Session در کنار هم
این مثال چند منبع Execution را در یک سناریوی قابل استفاده کنار هم قرار میدهد. خروجی نمونه صرفاً نمایشی است و مقادیر واقعی به بار کاری سرور وابستهاند.
SELECT r.session_id, r.status AS request_status, r.command,
r.cpu_time, r.total_elapsed_time, r.blocking_session_id,
s.login_name, s.host_name, s.program_name
FROM sys.dm_exec_requests AS r
JOIN sys.dm_exec_sessions AS s
ON s.session_id = r.session_id
WHERE r.session_id <> @@SPID
ORDER BY r.total_elapsed_time DESC;
| شاخص | نمونه | تفسیر |
|---|
| captured_at | 2026-07-21 12:00:00 | زمان Snapshot |
| result | نمونه متغیر | برای تحلیل روند باید با Baseline مقایسه شود. |
در محیط واقعی، Query را محدود نگه دارید و فقط برای ردیفهای مشکوک وارد مرحله Drill-down شوید.
مثال شماره 2: یافتن Queryهای پرCPU در Cache
این مثال چند منبع Execution را در یک سناریوی قابل استفاده کنار هم قرار میدهد. خروجی نمونه صرفاً نمایشی است و مقادیر واقعی به بار کاری سرور وابستهاند.
SELECT TOP (20)
qs.execution_count, qs.total_worker_time,
qs.total_worker_time / NULLIF(qs.execution_count,0) AS avg_cpu,
st.text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY qs.total_worker_time DESC;
| شاخص | نمونه | تفسیر |
|---|
| captured_at | 2026-07-21 12:00:00 | زمان Snapshot |
| result | نمونه متغیر | برای تحلیل روند باید با Baseline مقایسه شود. |
در محیط واقعی، Query را محدود نگه دارید و فقط برای ردیفهای مشکوک وارد مرحله Drill-down شوید.
مثال شماره 3: تحلیل Procedureهای پرهزینه
این مثال چند منبع Execution را در یک سناریوی قابل استفاده کنار هم قرار میدهد. خروجی نمونه صرفاً نمایشی است و مقادیر واقعی به بار کاری سرور وابستهاند.
SELECT TOP (20)
DB_NAME(database_id) AS database_name,
OBJECT_NAME(object_id,database_id) AS procedure_name,
execution_count, total_elapsed_time, total_logical_reads
FROM sys.dm_exec_procedure_stats
ORDER BY total_elapsed_time DESC;
| شاخص | نمونه | تفسیر |
|---|
| captured_at | 2026-07-21 12:00:00 | زمان Snapshot |
| result | نمونه متغیر | برای تحلیل روند باید با Baseline مقایسه شود. |
در محیط واقعی، Query را محدود نگه دارید و فقط برای ردیفهای مشکوک وارد مرحله Drill-down شوید.
مثال شماره 4: بررسی حجم Plan Cache
این مثال چند منبع Execution را در یک سناریوی قابل استفاده کنار هم قرار میدهد. خروجی نمونه صرفاً نمایشی است و مقادیر واقعی به بار کاری سرور وابستهاند.
SELECT objtype,
COUNT_BIG(*) AS plan_count,
SUM(CAST(size_in_bytes AS bigint))/1024.0/1024.0 AS size_mb
FROM sys.dm_exec_cached_plans
GROUP BY objtype
ORDER BY size_mb DESC;
| شاخص | نمونه | تفسیر |
|---|
| captured_at | 2026-07-21 12:00:00 | زمان Snapshot |
| result | نمونه متغیر | برای تحلیل روند باید با Baseline مقایسه شود. |
در محیط واقعی، Query را محدود نگه دارید و فقط برای ردیفهای مشکوک وارد مرحله Drill-down شوید.
مثال شماره 5: مشاهده اتصال، Session و درخواست فعال
این مثال چند منبع Execution را در یک سناریوی قابل استفاده کنار هم قرار میدهد. خروجی نمونه صرفاً نمایشی است و مقادیر واقعی به بار کاری سرور وابستهاند.
SELECT c.session_id, c.client_net_address, c.auth_scheme,
s.login_name, s.program_name, s.status AS session_status,
r.status AS request_status, r.command, r.wait_type
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s ON s.session_id=c.session_id
LEFT JOIN sys.dm_exec_requests AS r ON r.session_id=c.session_id
WHERE s.is_user_process=1;
| شاخص | نمونه | تفسیر |
|---|
| captured_at | 2026-07-21 12:00:00 | زمان Snapshot |
| result | نمونه متغیر | برای تحلیل روند باید با Baseline مقایسه شود. |
در محیط واقعی، Query را محدود نگه دارید و فقط برای ردیفهای مشکوک وارد مرحله Drill-down شوید.
مثال شماره 6: ساخت Snapshot سبک از وضعیت اجرا
این مثال چند منبع Execution را در یک سناریوی قابل استفاده کنار هم قرار میدهد. خروجی نمونه صرفاً نمایشی است و مقادیر واقعی به بار کاری سرور وابستهاند.
SELECT SYSDATETIME() AS captured_at,
(SELECT COUNT_BIG(*) FROM sys.dm_exec_sessions WHERE is_user_process=1) AS user_sessions,
(SELECT COUNT_BIG(*) FROM sys.dm_exec_requests WHERE session_id<>@@SPID) AS active_requests,
(SELECT COUNT_BIG(*) FROM sys.dm_exec_connections) AS connections,
(SELECT COUNT_BIG(*) FROM sys.dm_exec_cached_plans) AS cached_plans;
| شاخص | نمونه | تفسیر |
|---|
| captured_at | 2026-07-21 12:00:00 | زمان Snapshot |
| result | نمونه متغیر | برای تحلیل روند باید با Baseline مقایسه شود. |
در محیط واقعی، Query را محدود نگه دارید و فقط برای ردیفهای مشکوک وارد مرحله Drill-down شوید.
روش پیشنهادی برای Troubleshooting
- زمان دقیق رخداد و دامنه مشکل را مشخص کنید: کل سرور، یک Database، یک API یا یک Job.
- از requests، sessions و connections Snapshot فعالیت زنده بگیرید.
- برای Queryهای مشکوک، متن SQL و Execution Plan را جمعآوری کنید.
- با query_stats و آمار Module بررسی کنید مشکل لحظهای است یا الگوی تجمعی دارد.
- Plan Cache، Waitها، Memory، I/O و Query Store را برای تأیید علت کنار هم قرار دهید.
- پس از اصلاح، همان شاخصها را دوباره اندازهگیری و Before/After را مستند کنید.
خطاهای رایج در استفاده از Execution DMVها
- اشتباهگرفتن Correlation با Causation و انجام تغییر فوری بر اساس یک Snapshot.
- نادیدهگرفتن Lifetime دادههای وابسته به Plan Cache.
- جمعآوری تمام ستونها در فاصلههای بسیار کوتاه.
- عدم ثبت Timestamp و Context سرور/دیتابیس.
- فرض یکسانبودن DMVهای تخصصی در SQL Server، Azure SQL، Synapse و Fabric.
Performance و طراحی سامانه مانیتورینگ
یک سامانه مانیتورینگ خوب باید Observability ایجاد کند بدون اینکه خود به منبع مشکل تبدیل شود. Queryهای Capture را کوتاه، فیلترشده و قابل پیشبینی نگه دارید. برای Planهای XML یا متنهای بزرگ، ابتدا Top Offenderها را انتخاب کنید و سپس جزئیات را فقط برای همان ردیفها بخوانید.
برای آمار تجمعی، ذخیره Snapshot خام کافی نیست؛ Delta و Rate معمولاً معنادارتر هستند. برای مثال افزایش total_worker_time بین دو Snapshot در بازه یک دقیقه، اطلاعات عملیتری از مقدار کل از زمان ورود Plan به Cache میدهد. Restart و Cache Eviction را نیز بهعنوان مرز Baseline ثبت کنید.
Best Practices
- Runbook مشخص برای کندی، Blocking، CPU بالا و Connection Storm داشته باشید.
- Queryهای DMV را نسخهبندی و در محیط مشابه Production آزمایش کنید.
- Permission حداقلی و Account مانیتورینگ جداگانه تعریف کنید.
- Snapshotها را Retentionدار ذخیره و داده حساس Query Text را محافظت کنید.
- هر تغییر Performance را با Before/After و معیار قابل اندازهگیری ارزیابی کنید.
سؤالات متداول
پرسش ۱: DMV چیست؟
DMV یا Dynamic Management View نمایی از وضعیت داخلی و اطلاعات مدیریتی SQL Server است. برخی اشیای این خانواده Function هستند. داده آنها میتواند لحظهای یا وابسته به Cache باشد.
پرسش ۲: از کدام DMV برای شروع کندی استفاده کنیم؟
برای فعالیت زنده معمولاً requests و sessions نقطه شروع مناسبی هستند؛ سپس بر اساس نشانهها به Query Text، Plan، Waitها و آمار تجمعی میرویم.
پرسش ۳: آیا DMV جای ابزار Monitoring را میگیرد؟
خیر؛ DMV منبع داده بسیار ارزشمند است، اما ابزار Monitoring تاریخچه، هشدار، Visualization و Correlation خودکار فراهم میکند.
پرسش ۴: آیا داده DMV دائمی است؟
اغلب خیر. بسیاری از دادهها با Restart یا تغییر Cache از بین میروند. برای Trend باید Snapshotها را ذخیره کنید.
پرسش ۵: Query Store چه تفاوتی با query_stats دارد؟
Query Store تاریخچه پایدارتر و ساختاریافته Query/Plan را در Database ذخیره میکند، در حالی که query_stats به Plan Cache وابسته است.
پرسش ۶: آیا اجرای DMV در Production امن است؟
در اصل برای مشاهده طراحی شدهاند، اما Query سنگین، Polling سریع یا استخراج انبوه Plan میتواند سربار ایجاد کند. Capture را محدود و هدفمند طراحی کنید.
پرسش ۷: خطای رایج DBAها چیست؟
نتیجهگیری از یک Snapshot و تغییر فوری Index یا Configuration بدون تأیید علت، یکی از خطاهای پرهزینه است.
پرسش ۸: برای Performance چه چیزی مهمتر است؟
تعریف سؤال، Baseline، Sampling مناسب، Correlation چند منبع و سنجش Before/After از خود Query DMV مهمترند.
پرسش ۹: Best Practice برای ذخیره Snapshot چیست؟
ستونهای ضروری، Timestamp، Context محیط، Retention و شاخصهای قابل مقایسه را ذخیره کنید و از انبارکردن بیهدف همه ستونها پرهیز کنید.
پرسش ۱۰: آیا همه DMVها در همه محصولات Microsoft SQL یکساناند؟
خیر. Scope، Permission، ستونها و حتی وجود بعضی DMVها با نسخه و پلتفرم فرق دارد. مستندات نسخه مقصد مرجع نهایی است.
سؤالات مصاحبه
- تفاوت Connection، Session و Request را توضیح دهید.
- چرا sys.dm_exec_query_stats تاریخچه دائمی Queryها نیست؟
- چگونه Top CPU Query را پیدا و سپس Plan آن را تحلیل میکنید؟
- Plan Cache Bloat چه نشانههایی دارد و کدام DMV کمک میکند؟
- برای Correlation یک Blocking Incident چه دادههایی را همزمان Capture میکنید؟
جمعبندی و مسیر مطالعه
Execution DMVها یک جعبهابزار منسجم برای دیدن رفتار داخلی SQL Server هستند. بهترین مسیر یادگیری از سهگانه requests/sessions/connections شروع میشود، سپس query_stats و آمار Module را اضافه میکند و در نهایت Plan Cache و DMVهای تخصصی را بر اساس معماری سیستم به کار میگیرد.