Interleaved Execution برای Multi-Statement TVF؛ آموزش کامل INTERLEAVED_EXECUTION_TVF در SQL Server
Multi-Statement TVF میتواند برای Optimizer شبیه جعبه سیاه باشد. اگر تعداد واقعی ردیفها با تخمین فاصله داشته باشد، Joinها و Memory Grantهای بعدی هم روی پایه اشتباه ساخته میشوند.
MSTVFها historically میتوانند با تخمین ثابت Plan نامناسب بسازند. Interleaved Execution Optimization را موقتاً متوقف میکند، نتیجه TVF را میبیند و ادامه Plan را با تخمین واقعبینانهتری میسازد. در این مقاله از Syntax و خواندن مقدار فعلی شروع میکنیم و بعد به سناریوی واقعی، روش اندازهگیری، خطاهای رایج و تصمیم Production میرسیم.
برای دیدن ارتباط این گزینه با سایر تنظیمات، راهنمای جامع Database Scoped Performance Configuration را هم ببینید.
تعریف و منطق فنی
بهبود تخمین Cardinality برای MSTVF با مکث در Optimization و استفاده از نتیجه واقعی میانی.
MSTVFها historically میتوانند با تخمین ثابت Plan نامناسب بسازند. Interleaved Execution Optimization را موقتاً متوقف میکند، نتیجه TVF را میبیند و ادامه Plan را با تخمین واقعبینانهتری میسازد.
اصل عملی: تنظیم Performance فقط وقتی ارزش دارد که مسئله، معیار موفقیت و راه برگشت آن از قبل روشن باشد.
Syntax اصلی
ALTER DATABASE SCOPED CONFIGURATION SET INTERLEAVED_EXECUTION_TVF = ON;
مقادیر و رفتار
- مقدار یا فرمان: ON یا OFF.
- سناریوی مناسب: گزارش سازمانی با MSTVF که خروجی آن از چند ردیف تا صدها هزار ردیف تغییر دارد
- ریسک اصلی: این قابلیت جایگزین بازنویسی TVF ضعیف نیست و همه Queryها یا Functionها واجد شرایط نیستند.
- نکته نسخه: Interleaved Execution از SQL Server 2017 و Compatibility Level 140 در Adaptive Query Processing معرفی شد.
این نقشه رابطه INTERLEAVED_EXECUTION_TVF را با MSTVF، Cardinality و شاخصهای Runtime نشان میدهد. تصویر برای فهم دامنه اثر است و جای Execution Plan واقعی را نمیگیرد.
چطور قبل از تغییر تصمیم بگیریم
قبل از اجرای تغییر، Queryهای نماینده را بر اساس اهمیت تجاری و مصرف منابع جدا کنید. Plan آنها را در Query Store نگه دارید و فقط یک متغیر را تغییر دهید. اگر همزمان Index، Compatibility Level و INTERLEAVED_EXECUTION_TVF را عوض کنید، Attribution نتیجه از بین میرود.
معیار تک Query و معیار کل Workload را جدا ببینید. ممکن است یک Query سریعتر شود اما Throughput کل افت کند. این قابلیت جایگزین بازنویسی TVF ضعیف نیست و همه Queryها یا Functionها واجد شرایط نیستند. به همین دلیل Concurrency و مصرف منابع باید کنار زمان پاسخ سنجیده شود.
اشتباه رایج: نگهداشتن MSTVF بسیار پیچیده فقط به امید Interleaved Execution، در حالی که Inline TVF یا بازنویسی Set-based بهتر است. راه حرفهای این است که فرضیه، Baseline، Change و Rollback در یک سند کوتاه و قابل بازبینی ثبت شوند.
جریان INTERLEAVED_EXECUTION_TVF از مشاهده وضعیت، اعمال Change، Compile یا Runtime Behavior و سپس Measure عبور میکند. نقاط اندازهگیری قبل و بعد باید یکسان باشند.
۱۰ مثال عملی و قابل اجرا
مثال 1: مشاهده وضعیت واقعی قبل از تغییر
برای Interleaved Execution برای Multi-Statement TVF اولین قدم تغییر نیست؛ ثبت وضعیت فعلی است. خروجی را همراه زمان، نسخه و نام Database نگه دارید تا Baseline قابل استناد باشد.
SELECT name, value, value_for_secondary
FROM sys.database_scoped_configurations
WHERE name = N'INTERLEAVED_EXECUTION_TVF';
| name | value | برداشت |
|---|
| INTERLEAVED_EXECUTION_TVF | مقدار فعلی | از همان سرور خوانده شود |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
مثال 2: فعالسازی کنترلشده در محیط آزمایشی
در این سناریو INTERLEAVED_EXECUTION_TVF را فقط جایی تغییر میدهیم که Baseline داریم. یک اجرای سریع برای تصمیم نهایی کافی نیست و باید چند چرخه کاری قابل مقایسه سنجیده شود.
ALTER DATABASE SCOPED CONFIGURATION SET INTERLEAVED_EXECUTION_TVF = ON;
| عملیات | خروجی نمونه | کنترل |
|---|
| INTERLEAVED_EXECUTION_TVF | Command completed successfully | مقدار دوباره خوانده شود |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
مثال 3: بازگشت مستند به رفتار قبلی
Performance Change بدون Rollback کامل نیست. چون این قابلیت جایگزین بازنویسی TVF ضعیف نیست و همه Queryها یا Functionها واجد شرایط نیستند.، فرمان بازگشت باید پیش از Deployment آماده باشد و تیم در زمان Incident بداههکاری نکند.
ALTER DATABASE SCOPED CONFIGURATION SET INTERLEAVED_EXECUTION_TVF = OFF;
| Rollback | خروجی نمونه | معیار |
|---|
| INTERLEAVED_EXECUTION_TVF | Command completed successfully | رفتار قبلی تأیید شود |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
مثال 4: بررسی Compatibility Level
بسیاری از قابلیتها به Compatibility Level وابستهاند. پیش از نتیجهگیری درباره INTERLEAVED_EXECUTION_TVF، نسخه Engine و سطح سازگاری Database را کنار هم ثبت کنید.
SELECT DB_NAME() AS DatabaseName, compatibility_level
FROM sys.databases
WHERE database_id = DB_ID();
| Database | compatibility_level | نکته |
|---|
| CurrentDatabase | 150/160/170 | وابسته به نسخه و محیط |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
مثال 5: مقایسه قبل و بعد با Query Store
Query Store امکان دیدن Plan و Runtime را در دو بازه زمانی میدهد. برای Interleaved Execution برای Multi-Statement TVF این داده تاریخی بسیار قابل اعتمادتر از یک Screenshot یا حس کلی کاربر است.
SELECT TOP (20) qsq.query_id, qsp.plan_id, rs.avg_duration, rs.avg_cpu_time
FROM sys.query_store_query AS qsq
JOIN sys.query_store_plan AS qsp ON qsp.query_id = qsq.query_id
JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id = qsp.plan_id
ORDER BY rs.avg_duration DESC;
| منبع | خروجی | تفسیر |
|---|
| Query Store | Plan/Runtime rows | بازه قبل و بعد همسطح باشد |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
مثال 6: ساخت Workload کوچک و قابل تکرار
Workload آزمایشی باید همان رفتاری را تحریک کند که Feature برای آن ساخته شده است: بهبود تخمین Cardinality برای MSTVF با مکث در Optimization و استفاده از نتیجه واقعی میانی. Query خیلی کوچک ممکن است هیچ تفاوتی نشان ندهد.
SELECT name,type_desc FROM sys.objects WHERE type IN ('TF','IF') ORDER BY name;
| Metric | نمونه | نکته |
|---|
| Elapsed/CPU/Reads | وابسته به داده | چند اجرا مقایسه شود |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
مثال 7: خواندن شاخص Runtime مرتبط
یک DMV بهتنهایی حقیقت کامل Performance نیست. برای INTERLEAVED_EXECUTION_TVF داده Runtime را کنار Execution Plan، Query Store و وضعیت منابع قرار دهید.
SELECT counter_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE N'%SQL Statistics%'
AND counter_name IN (N'Batch Requests/sec',N'SQL Compilations/sec',N'SQL Re-Compilations/sec');
| Runtime signal | نمونه | برداشت |
|---|
| Cardinality | قابل اندازهگیری | روند مهمتر از Snapshot است |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
مثال 8: پیداکردن Queryهای پرریسک
بهجای جستوجوی تصادفی، Queryهای پرتکرار یا پرمصرف را جدا کنید و ببینید آیا مشکل واقعاً با بهبود تخمین Cardinality برای MSTVF با مکث در Optimization و استفاده از نتیجه واقعی میانی ارتباط دارد یا علت اصلی Statistics، Index، Blocking یا طراحی Query است.
SELECT TOP (20) qs.execution_count, qs.total_worker_time, qs.total_elapsed_time,
SUBSTRING(st.text,1,300) AS sample_sql
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;
| Query | نشانه | اقدام |
|---|
| Top workload | CPU/Duration/Spill | Plan واقعی بررسی شود |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
مثال 9: قرار دادن Guard در Deployment
Deployment حرفهای باید Fail Fast باشد. Guard نسخهای کمک میکند تغییر INTERLEAVED_EXECUTION_TVF روی محیطی که ارزیابی نشده اجرا نشود و رفتار غیرمنتظره نسازد.
IF CAST(SERVERPROPERTY('ProductMajorVersion') AS int) >= 13
BEGIN
ALTER DATABASE SCOPED CONFIGURATION SET INTERLEAVED_EXECUTION_TVF = ON;
END
ELSE
THROW 50010, N'نسخه موتور برای این Deployment بررسی شود.', 1;
| Deployment | Result | Safety |
|---|
| Version guard | Pass/Throw | اجرای کنترلشده |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
مثال 10: Rollback و تأیید مقدار نهایی
Rollback فقط اجرای Command معکوس نیست. مقدار نهایی، Planهای مهم و Metricهای Baseline باید دوباره کنترل شوند تا بازگشت واقعاً تأیید شود.
-- Rollback کنترلشده
ALTER DATABASE SCOPED CONFIGURATION SET INTERLEAVED_EXECUTION_TVF = OFF;
SELECT name, value, value_for_secondary
FROM sys.database_scoped_configurations
WHERE name = N'INTERLEAVED_EXECUTION_TVF';
| مرحله | خروجی | معیار پایان |
|---|
| Rollback | تنظیم قبلی | Baseline دوباره کنترل شود |
خروجی جدول فقط شکل نمونه نتیجه را نشان میدهد. مقدار واقعی INTERLEAVED_EXECUTION_TVF به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.
خطاهای رایج
- نگهداشتن MSTVF بسیار پیچیده فقط به امید Interleaved Execution، در حالی که Inline TVF یا بازنویسی Set-based بهتر است.
- اعمال چند تغییر Performance در یک Release و از دست دادن امکان تشخیص علت.
- مقایسه Warm Cache با Cold Cache و نتیجهگیری قطعی.
- نادیده گرفتن تفاوت نسخه، CU و Compatibility Level بین Test و Production.
- تمرکز فقط روی Duration و ندیدن CPU، Reads، Memory، Spill، Blocking یا Throughput.
Performance Considerations
اثر INTERLEAVED_EXECUTION_TVF را با Metric همان Feature بسنجید. مفاهیم کلیدی این مقاله: Interleaved Execution, MSTVF, Cardinality, Optimization, Compatibility 140. اگر معیار انتخابی با این زنجیره ارتباطی ندارد، آزمایش ممکن است نتیجه گمراهکننده بدهد.
این قابلیت جایگزین بازنویسی TVF ضعیف نیست و همه Queryها یا Functionها واجد شرایط نیستند. این ریسک دلیل طراحی آزمایش بهتر است، نه دلیل تصمیم عجولانه. Query Store، Actual Plan و DMVهای Runtime را کنار هم ببینید.
بهترین روشها
- مقدار فعلی، نسخه Engine و Compatibility Level را ثبت کنید.
- Baseline Queryهای حیاتی را بگیرید.
- تغییر را ابتدا در محیط مشابه Production یا بازه کمریسک اجرا کنید.
- فقط یک متغیر Performance را عوض کنید.
- Rollback را پیش از Deployment بنویسید.
- Plan و Runtime را در چند بازه بررسی کنید.
- اگر نتیجه مبهم است تغییر را دائمی نکنید.
سناریوی عملی INTERLEAVED_EXECUTION_TVF سه بخش دارد: Baseline، تغییر کنترلشده و تصمیم بر اساس Measure. حذف هر کدام کیفیت تصمیم را پایین میآورد.
سؤالات متداول
INTERLEAVED_EXECUTION_TVF دقیقاً چه مشکلی را هدف میگیرد؟
برای بهبود تخمین Cardinality برای MSTVF با مکث در Optimization و استفاده از نتیجه واقعی میانی طراحی شده است. ارزش آن زمانی روشن میشود که قبل از تغییر Baseline داشته باشید و اثر را روی Workload واقعی بسنجید.
مقدار فعلی INTERLEAVED_EXECUTION_TVF را چگونه ببینیم؟
از sys.database_scoped_configurations شروع کنید و خروجی را کنار نسخه Engine، Compatibility Level و وضعیت Query Store ثبت کنید.
آیا INTERLEAVED_EXECUTION_TVF همیشه SQL Server را سریعتر میکند؟
خیر. این قابلیت جایگزین بازنویسی TVF ضعیف نیست و همه Queryها یا Functionها واجد شرایط نیستند. بنابراین CPU، Duration، Reads و Metric مرتبط با Feature باید قبل و بعد مقایسه شوند.
چه سناریوی تجاری برای INTERLEAVED_EXECUTION_TVF مناسب است؟
نمونه روشن: گزارش سازمانی با MSTVF که خروجی آن از چند ردیف تا صدها هزار ردیف تغییر دارد. در پروژه واقعی Change Window، Rollback و معیار موفقیت را قبل از تغییر تعریف کنید.
INTERLEAVED_EXECUTION_TVF چه تفاوتی با تنظیم سراسری دارد؟
Database Scoped Configuration دامنه اثر را محدودتر میکند و برای Instanceهای چند Workload کنترل دقیقتری میدهد؛ با این حال Hintهای Query و تنظیمات دیگر ممکن است رفتار نهایی را تغییر دهند.
برای پیادهسازی حرفهای INTERLEAVED_EXECUTION_TVF چه کاری لازم است؟
بررسی Query Store، Execution Plan، Baseline، تست بار و Rollback. آموزش و مشاوره زمانی مفید است که تصمیم بر اساس داده همان سامانه گرفته شود.
رایجترین خطا درباره INTERLEAVED_EXECUTION_TVF چیست؟
نگهداشتن MSTVF بسیار پیچیده فقط به امید Interleaved Execution، در حالی که Inline TVF یا بازنویسی Set-based بهتر است. این کار اغلب یک درمان موقت را به سیاست دائمی تبدیل میکند.
اثر Performance INTERLEAVED_EXECUTION_TVF را چگونه بسنجیم؟
بازههای همسطح را مقایسه کنید و CPU، Duration، Reads و Metric تخصصی Feature را بسنجید. Query Store برای Plan Regression بسیار مفید است.
Best Practice تغییر INTERLEAVED_EXECUTION_TVF چیست؟
تغییر را کوچک، مستند و قابل برگشت نگه دارید؛ فقط یک متغیر Performance را در هر آزمایش عوض کنید و نتیجه را چند بار بسنجید.
INTERLEAVED_EXECUTION_TVF با چه نسخههایی سازگار است؟
Interleaved Execution از SQL Server 2017 و Compatibility Level 140 در Adaptive Query Processing معرفی شد. مستندات همان نسخه و Compatibility Level محیط خود را ملاک نهایی قرار دهید.
سؤالات مصاحبه
- چرا برای INTERLEAVED_EXECUTION_TVF Baseline لازم است؟
- اگر بعد از تغییر INTERLEAVED_EXECUTION_TVF یک Query بهتر و چند Query بدتر شوند چه میکنید؟
- Query Store در ارزیابی Interleaved Execution برای Multi-Statement TVF چه نقشی دارد؟
- چطور مشکل Statistics را از اثر INTERLEAVED_EXECUTION_TVF جدا میکنید؟
- Rollback شما برای INTERLEAVED_EXECUTION_TVF در Production چیست؟
چکلیست نهایی
- مقدار فعلی INTERLEAVED_EXECUTION_TVF ثبت شده است.
- Baseline مشخص است.
- نسخه و Compatibility Level کنترل شدهاند.
- معیار موفقیت و شکست نوشته شدهاند.
- Rollback آماده است.
- Query Store و Planهای مهم بعد از تغییر بررسی میشوند.
جمعبندی
Interleaved Execution برای Multi-Statement TVF زمانی مفید است که با مسئله واقعی و قابل اندازهگیری استفاده شود. بهبود تخمین Cardinality برای MSTVF با مکث در Optimization و استفاده از نتیجه واقعی میانی. بهجای تغییر بر اساس توصیه عمومی، Workload خودتان را بسنجید و تغییر را قابل برگشت نگه دارید.
برای مقایسه این گزینه با سایر اعضای همین خانواده به مقاله مادر تنظیمات Performance در سطح Database برگردید.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان؛ قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620. انجام پروژه، آموزش برنامهنویسی و آموزش پایگاه داده SQL Server برای پروژههای آموزشی، سازمانی و تجاری.
مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی
از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری فعالیت میکنیم.
برای سفارش پروژههای برنامهنویسی و پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری جدید با شماره 09131253620 تماس حاصل فرمایید.
ایتا، واتساپ و تماس مستقیم: +989131253620
تماس با ما