در پروژههای واقعی SQL Server، یکی از مشکلاتی که تقریباً هر DBA یا توسعهدهنده با آن مواجه میشود، Stored Procedureهای کند است. این کندی میتواند به دلایل متعددی رخ دهد: حجم دادهها، قفلها، پارامترهای حساس، یا طراحی نامناسب کوئریها.
اصل قضیه ساده است: اگر SPها بهینه نباشند، کل عملکرد سرور تحت تأثیر قرار میگیرد. گزارشها دیر لود میشوند، کاربران نارضایتی پیدا میکنند و منابع سرور هدر میروند.
در این مقاله، به جای صحبتهای کلی، راهکارهای عملی و قابل اجرا با استفاده از Extended Events را بررسی میکنیم. با مثالهای واقعی و قابل اجرا روی دیتابیسهای شناخته شده مانند Northwind و AdventureWorks، یاد میگیریم چطور SPهای کند را شناسایی و اصلاح کنیم.
مفهوم Extended Events برای تشخیص SPهای کند
Extended Events (XEvents) یکی از ابزارهای پیشرفته SQL Server برای ردیابی و مانیتورینگ عملکرد است. این ابزار سبک، سریع و منعطف است و میتواند دقیقاً نشان دهد کدام SP یا Query بیشترین زمان اجرا، CPU یا IO را مصرف میکند.
چرا Extended Events؟
- مصرف منابع کمتر نسبت به SQL Trace یا Profiler
- امکان فیلتر دقیق روی SPها، بانکها، کاربران و کوئریها
- ذخیره دادهها برای آنالیز بعدی و گزارشگیری
با استفاده از XEvents، میتوانیم دادههای عملکردی دقیق جمعآوری کنیم و به راحتی SPهای مشکلساز را شناسایی کنیم.
راهاندازی Extended Events برای شناسایی SPهای کند
۱. ایجاد Session پایه
ابتدا یک Session ایجاد میکنیم که اجرای SPهای کند (مثلاً بیشتر از 500ms) را ثبت کند:
CREATE EVENT SESSION [SlowSPTracking]
ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
WHERE duration > 5000000 -- میکروثانیه، معادل ۵ ثانیه
)
ADD TARGET package0.event_file(
SET filename = 'C:\XEvents\SlowSPs.xel'
);
GO
ALTER EVENT SESSION [SlowSPTracking] ON SERVER STATE = START;
این Session تمام SPها یا کوئریهایی که زمان اجرا بیش از ۵ ثانیه دارند را ذخیره میکند.
۲. مشاهده و تحلیل دادههای جمعآوریشده
میتوانیم دادهها را با کوئری زیر بخوانیم:
SELECT
event_data.value('(event/@name)[1]', 'nvarchar(50)') AS EventName,
event_data.value('(event/data[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS SQLText,
event_data.value('(event/data[@name="duration"]/value)[1]', 'bigint') AS Duration,
event_data.value('(event/action[@name="sqlserver.username"]/value)[1]', 'nvarchar(50)') AS Username
FROM (
SELECT CAST(event_data AS XML) AS event_data
FROM sys.fn_xe_file_target_read_file(
'C:\XEvents\SlowSPs*.xel', NULL, NULL, NULL
)
) AS xevents;
با این روش میتوانیم فهرست دقیق SPهای کند و زمان اجرای آنها را مشاهده کنیم.
۳. افزودن فیلترها و هدفگذاری دقیقتر
گاهی لازم است فقط SPهای مربوط به یک دیتابیس یا کاربر خاص بررسی شوند:
CREATE EVENT SESSION [SlowSPTrackingFiltered]
ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
WHERE duration > 3000000
AND database_name = 'AdventureWorksDW'
)
ADD TARGET package0.event_file(
SET filename = 'C:\XEvents\FilteredSlowSPs.xel'
);
GO
با این فیلتر، حجم دادههای جمعآوری شده کمتر و تحلیل راحتتر میشود.
نمونه عملی روی Northwind
فرض کنید میخواهیم SPهای مرتبط با Orders که بیش از ۲ ثانیه طول میکشند را بررسی کنیم. با اجرای Session و مشاهده نتایج، میتوانیم ببینیم کدام SP:
- Joinهای غیرکارا دارد
- از Indexهای مناسب استفاده نکرده
- بیش از حد Rows Scan میکند
با این اطلاعات، میتوان Remediation Plan تعریف کرد.
اصلاح Stored Procedureهای کند
۱. بررسی Execution Plan
ابتدا Execution Plan SP را بررسی میکنیم. نکات مهم:
۲. بهینهسازی کوئریها
- استفاده از INDEX مناسب
- پرهیز از * SELECT
- جایگزینی Cursors با Set-based Operations
۳. Parameter Sniffing و PSP
گاهی SP کند میشود چون SQL Server Plan اولیه را براساس پارامتر خاصی ذخیره میکند.
برای حل این مشکل:
- از OPTION (RECOMPILE) برای SPهایی که پارامتر حساس هستند استفاده کنید
- یا Plan Guides تعریف کنید
مانیتورینگ و نگهداری مداوم
تشخیص SPهای کند یک کار یکباره نیست. باید:
- Extended Events Sessionها را به صورت دورهای اجرا کنید
- نتایج را با Performance Metrics ترکیب کنید
- SPهای مشکلدار را اولویتبندی و اصلاح کنید
با این روش میتوان عملکرد کل سرور را بهبود داد و از مشکلات آینده جلوگیری کرد.
نکات حرفهای و Best Practices
- Threshold مناسب تعیین کنید: زمان اجرای SPها را با توجه به بار کاری مشخص کنید.
- جمعآوری دادهها را زمانبندی کنید: برای جلوگیری از فشار روی سرور در ساعات اوج.
- Remediation Plan داشته باشید: هر SP کند بعد از شناسایی باید مسیر بهینهسازی داشته باشد.
- Automation با PowerShell یا SQL Agent: Sessionهای XEvents را به صورت خودکار راهاندازی کنید.
سؤالات متداول (FAQ)
۱. Extended Events چقدر منابع سرور را مصرف میکند؟
کمتر از SQL Trace است، اما بهتر است Threshold و فیلترها را مناسب تنظیم کنید.
۲. آیا میتوان SPهای DirectQuery در Power BI را با XEvents مانیتور کرد؟
بله، SPها در سرور SQL قابل تشخیص هستند، اما باید Session روی همان سرور تنظیم شود.
۳. اگر SPهایی با Parameter Sensitive داشته باشیم چه کار کنیم؟
میتوان از Plan Guide یا OPTION(RECOMPILE) استفاده کرد تا Plan اولیه برای پارامتر خاص قفل نشود.
۴. XEvents محدودیت نسخه SQL Server دارد؟
XEvents از SQL Server 2008 معرفی شد و در نسخههای جدید کاملتر و بهینهتر است.
۵. چطور نتایج XEvents را آرشیو کنیم؟
میتوان فایلها را به SQL Table Import کرد یا با PowerShell برای تحلیلهای بعدی آماده کرد.
تماس و مشاوره تخصصی
برای پیادهسازی Extended Events، شناسایی SPهای کند و بهینهسازی آنها در SQL Server میتوان از خدمات تخصصی مشاوره و اجرا شرکت لاندا استفاده کرد.
این خدمات شامل بررسی Performance، ارائه Plan اصلاح، و آموزش تیمهای فنی است.
برای درخواست مشاوره و PoC عملی میتوانید با تبا کارشناسان لاندا در تماس ✆ باشید.

و سپس «افزودن به صفحه اصلی» ضربه بزنید
و سپس «افزودن به صفحه اصلی» ضربه بزنید

نظری داده نشده