آموزش جامع Optimized Plan Forcing در SQL Server؛ وادارسازی بهینه پلن
مسئلهای که Optimized Plan Forcing حل میکند
یک Query ثابت در برابر حجم داده، توزیع پارامتر و وضعیت Cache همیشه رفتار یکسانی ندارد. Optimized Plan Forcing برای همین نوسان ساخته شده و هزینه کامپایل مجدد Plan اجباری را با Optimization Replay کاهش میدهد.
این مقاله از سطح مقدماتی آغاز میکند و پیشنیاز SQL Server 2022، Compatibility Level 160، منطق Query Store و Optimization Replay، ده آزمایش عملی و روش تصمیمگیری برای Production را پوشش میدهد.
مثالها را در پایگاه آزمایشی اجرا کنید؛ برای مشاهده نتیجه به Actual Execution Plan، مجوز ساخت Object و ترجیحاً Query Store نیاز دارید.
بازگشت به راهنمای جامع Intelligent Query Processing
تعریف و جایگاه موضوع
Optimized Plan Forcing یا وادارسازی بهینه پلن در خانواده Intelligent Query Processing قرار میگیرد. هزینه کامپایل مجدد Plan اجباری را با Optimization Replay کاهش میدهد. سیگنالهای اصلی آن Query Store, Forced Plan, Optimization Replay, Compile Time هستند و نتیجه باید در Plan یا Runtime Stats قابل مشاهده باشد.
سناریوی مناسب، Queryهای پیچیده با Compile Time بالا است. این قابلیت یک درمان عمومی برای Schema نامناسب، Statistics منقضی یا Predicate غیرSARGable نیست و باید بعد از تشخیص ریشه مسئله انتخاب شود.
این نقشه جایگاه Optimized Plan Forcing را با محورهای Query Store، Optimization Replay و Plan Regression نشان میدهد.
نحو، تنظیمات و نوع خروجی
تنظیم پایه
ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_PLAN_FORCING = ON;
نسخه، پارامتر و رفتار ویژه
| مولفه | مقدار | تفسیر |
|---|
| نسخه | SQL Server 2022 | نسخه پایه قابلیت |
| Compatibility Level | 160 | شرط فعالشدن Optimizer |
| ورودی | Optimization Replay | سیگنال تصمیم |
| خروجی | Plan یا Runtime behavior | نوع داده Query تغییر نمیکند |
| NULL | وابسته به Predicate | آزمون مستقل لازم است |
Optimized Plan Forcing Return Type مستقلی به برنامه برنمیگرداند؛ نتیجه آن در انتخاب Operator، Variant، Grant، DOP یا زمان Compile دیده میشود. بنابراین خروجی SELECT همان نوع داده عبارت اصلی باقی میماند.
اجزای اصلی و منطق اجرا
1. نقش Query Store
در زنجیره تصمیم Optimized Plan Forcing، مؤلفه Query Store باید همراه با Actual Rows، هزینه Operatorهای مجاور و تکرار اجرا تحلیل شود. مشاهده نام یک ویژگی بدون تغییر قابل اندازهگیری، اثبات موفقیت نیست.
2. نقش Forced Plan
در زنجیره تصمیم Optimized Plan Forcing، مؤلفه Forced Plan باید همراه با Actual Rows، هزینه Operatorهای مجاور و تکرار اجرا تحلیل شود. مشاهده نام یک ویژگی بدون تغییر قابل اندازهگیری، اثبات موفقیت نیست.
3. نقش Optimization Replay
در زنجیره تصمیم Optimized Plan Forcing، مؤلفه Optimization Replay باید همراه با Actual Rows، هزینه Operatorهای مجاور و تکرار اجرا تحلیل شود. مشاهده نام یک ویژگی بدون تغییر قابل اندازهگیری، اثبات موفقیت نیست.
4. نقش Compile Time
در زنجیره تصمیم Optimized Plan Forcing، مؤلفه Compile Time باید همراه با Actual Rows، هزینه Operatorهای مجاور و تکرار اجرا تحلیل شود. مشاهده نام یک ویژگی بدون تغییر قابل اندازهگیری، اثبات موفقیت نیست.
این جریان، مسیر Query از Query Store تا مشاهده Plan Regression را برای Optimized Plan Forcing قابل پیگیری میکند.
مثالهای عملی از ساده تا پیشرفته
مثال 1: بررسی سطح سازگاری
پیش از تحلیل Optimized Plan Forcing سطح سازگاری را ثبت میکنیم.
SELECT DB_NAME() DatabaseName,compatibility_level FROM sys.databases WHERE name=DB_NAME();
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Database | Current |
| Compatibility | 160 |
نکته کاربردی: سطح هدف این مقاله 160 است.
مثال 2: فعالسازی کنترلشده
تنظیم مرتبط با Optimized Plan Forcing در محیط آزمایشی فعال میشود.
ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_PLAN_FORCING = ON;
SELECT name,value FROM sys.database_scoped_configurations ORDER BY name;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Action | Enable |
| Scope | Database |
نکته کاربردی: Baseline پیش از تغییر را نگه دارید.
مثال 3: ساخت داده نمونه
دادهای متناسب با Query Store و Forced Plan ساخته میشود.
ALTER DATABASE CURRENT SET QUERY_STORE=ON;
DROP TABLE IF EXISTS dbo.IQP_OPF; CREATE TABLE dbo.IQP_OPF(ID bigint IDENTITY PRIMARY KEY,StoreID int,SaleDate date,Amount money);
INSERT dbo.IQP_OPF(StoreID,SaleDate,Amount) SELECT TOP (60000) ABS(CHECKSUM(NEWID()))%300,DATEADD(day,-ABS(CHECKSUM(NEWID()))%730,CONVERT(date,GETDATE())),1+ABS(CHECKSUM(NEWID()))%30000 FROM sys.all_objects a CROSS JOIN sys.all_objects b;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Object | IQP_OPTIMIZED_PLAN |
| Purpose | وادارسازی بهینه پلن |
نکته کاربردی: حجم و Skew را شبیه Production تنظیم کنید.
مثال 4: اجرای سناریوی پایه
Query پایه برای مشاهده Optimization Replay اجرا میشود.
DECLARE @StoreID int=25; SELECT SaleDate,SUM(Amount) Revenue FROM dbo.IQP_OPF WHERE StoreID=@StoreID GROUP BY SaleDate ORDER BY SaleDate;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Signal | Optimization Replay |
| Expected | Inspect actual plan |
نکته کاربردی: Actual Plan را ذخیره کنید.
مثال 5: ثبت XML Plan
ویژگیهای Compile Time و Plan Regression در Plan بررسی میشوند.
SET STATISTICS XML ON;
DECLARE @StoreID int=25; SELECT SaleDate,SUM(Amount) Revenue FROM dbo.IQP_OPF WHERE StoreID=@StoreID GROUP BY SaleDate ORDER BY SaleDate;
SET STATISTICS XML OFF;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Artifact | Actual XML Plan |
| Inspect | Plan Regression |
نکته کاربردی: Estimated Plan برای Feedback کافی نیست.
مثال 6: تکرار اجرا
برای شکلگیری تاریخچه Optimized Plan Forcing چند اجرای متوالی انجام میشود.
DECLARE @i int=1; WHILE @i<=6 BEGIN
DECLARE @StoreID int=25; SELECT SaleDate,SUM(Amount) Revenue FROM dbo.IQP_OPF WHERE StoreID=@StoreID GROUP BY SaleDate ORDER BY SaleDate;
SET @i+=1; END;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Executions | 6 |
| Observation | Runtime evolution |
نکته کاربردی: بین اجراها Cache را بیدلیل پاک نکنید.
مثال 7: تحلیل Query Store
Runtime Stats و Planهای Optimized Plan Forcing از Query Store خوانده میشوند.
ALTER DATABASE CURRENT SET QUERY_STORE=ON;
SELECT TOP (20) q.query_id,p.plan_id,p.is_forced_plan,rs.count_executions,rs.avg_duration,rs.avg_cpu_time,rs.avg_logical_io_reads
FROM sys.query_store_query_text qt JOIN sys.query_store_query q ON q.query_text_id=qt.query_text_id
JOIN sys.query_store_plan p ON p.query_id=q.query_id JOIN sys.query_store_runtime_stats rs ON rs.plan_id=p.plan_id
WHERE qt.query_sql_text LIKE N'%IQP_OPTIMIZED_PL%' ORDER BY rs.last_execution_time DESC;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Repository | Query Store |
| Metrics | CPU, IO, Duration |
نکته کاربردی: بازههای زمانی همسان را مقایسه کنید.
مثال 8: آزمون NULL و حالت مرزی
شاخه کمانتخاب یا NULL برای Optimized Plan Forcing آزمایش میشود.
SELECT query_id,plan_id,is_forced_plan,force_failure_count,last_force_failure_reason_desc FROM sys.query_store_plan WHERE is_forced_plan=1;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Case | NULL / Edge |
| Expected | No error |
نکته کاربردی: حالت مرزی را در Regression Test نگه دارید.
مثال 9: مقایسه A/B
اثر Optimized Plan Forcing با خاموش و روشنکردن کنترلشده مقایسه میشود.
ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_PLAN_FORCING = OFF;
DECLARE @StoreID int=25; SELECT SaleDate,SUM(Amount) Revenue FROM dbo.IQP_OPF WHERE StoreID=@StoreID GROUP BY SaleDate ORDER BY SaleDate;
ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_PLAN_FORCING = ON;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| A | Feature OFF |
| B | Feature ON |
نکته کاربردی: در Production تغییر سراسری بدون Change Plan انجام ندهید.
مثال 10: پایش معیار پذیرش
CPU، IO و Duration برای پذیرش Optimized Plan Forcing ثبت میشود.
SET STATISTICS IO ON; SET STATISTICS TIME ON;
DECLARE @StoreID int=25; SELECT SaleDate,SUM(Amount) Revenue FROM dbo.IQP_OPF WHERE StoreID=@StoreID GROUP BY SaleDate ORDER BY SaleDate;
SET STATISTICS TIME OFF; SET STATISTICS IO OFF;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Accept | Lower resource or stable plan |
| Rollback | Prior config |
نکته کاربردی: نتیجه را با SLA و Throughput کل سرور بسنجید.
کاربردهای واقعی در پروژه
کاربرد شاخص Optimized Plan Forcing در Queryهای پیچیده با Compile Time بالا دیده میشود. تیم باید Queryهای کاندید را بر اساس سهم CPU، Duration و Logical Reads اولویتبندی کند و از تغییر همه Queryها یا همه تنظیمات به صورت همزمان پرهیز کند.
در پروژه سازمانی، خروجی مطلوب فقط کاهش زمان یک اجرا نیست. ثبات Plan در ساعات پرترافیک، Throughput کل سامانه، Tail Latency، فشار tempdb و امکان Rollback نیز بخشی از معیار پذیرش هستند.
هشدار مهم نسخه و Eligibility
نام Optimized Plan Forcing در نسخه SQL Server 2022 به معنی استفاده قطعی آن در هر Query نیست. Compatibility Level 160، Build، تنظیم Scoped، شکل Query و Eligibility همزمان تعیینکنندهاند.
پیش از تغییر Production، Cumulative Update، وضعیت Query Store و Hintهای موجود را ثبت کنید. Hint ثابت یا پاکسازی مکرر Cache ممکن است رفتار تطبیقی را محدود کند.
اشتباهات رایج و روش اصلاح
| اشتباه | پیامد | اصلاح عملی |
|---|
| قضاوت با یک اجرا | نتیجه Cache-sensitive | چند اجرای کنترلشده |
| داده یکنواخت | پنهانشدن رفتار تطبیقی | Skew و NULL واقعی |
| پاککردن دائم Cache | حذف Feedback یا Variant | سیاست Cache ثابت |
| تمرکز فقط بر Duration | پنهانشدن CPU و IO | ثبت چند معیار |
| تغییر سراسری | ریسک Regression | Pilot و Rollback |
Performance Considerations
برای Optimized Plan Forcing، Plan را از نظر Query Store، Optimization Replay و Plan Regression با Baseline مقایسه کنید. Estimated Rows و Actual Rows، CPU Time، Elapsed Time و Logical Reads باید همزمان خوانده شوند.
- تغییر Query Store را در Actual Plan ثبت کنید.
- اثر Optimization Replay را روی انتخاب Plan یا Runtime بسنجید.
- Warm Cache و Cold Cache را جداگانه آزمایش کنید.
- Tail Latency و Throughput را کنار میانگین زمان پاسخ نگه دارید.
- Query Store را از نظر فضای مصرفی و Read Write بودن پایش کنید.
Best Practices
- Query کاندید را با شواهد انتخاب کنید.
- نسخه، Build و تنظیمات را در Change Record ثبت کنید.
- داده تست را از نظر حجم، Skew و NULL شبیه Production بسازید.
- A/B Test را با سیاست Cache یکسان انجام دهید.
- معیار توقف و Rollback Plan را پیش از انتشار تصویب کنید.
- پس از ارتقا یا تغییر Index، نتیجه را دوباره بررسی کنید.
این پنل، Best Path و خطای رایج Optimized Plan Forcing را کنار CPU، IO و Latency قرار میدهد.
مزایا، محدودیتها و زمان نامناسب استفاده
| جنبه | تحلیل تصمیم |
|---|
| مزیت | تصمیم آگاهتر از Optimization Replay |
| محدودیت | وابستگی به نسخه و Eligibility |
| زمان نامناسب | Query کوچک یا مشکل طراحی Schema |
| مکمل | Index، Statistics و Query SARGable |
سؤالات متداول
Optimized Plan Forcing چه مسئلهای را حل میکند؟
وادارسازی بهینه پلن هزینه کامپایل مجدد Plan اجباری را با Optimization Replay کاهش میدهد و برای Queryهای پیچیده با Compile Time بالا مناسب است.
چگونه استفاده واقعی Optimized Plan Forcing را تشخیص دهیم؟
Actual Plan، Query Store و شاخصهای Query Store و Plan Regression را پیش و پس از اجرا مقایسه کنید.
آیا Optimized Plan Forcing برای هر سامانه تجاری مناسب است؟
خیر؛ Baseline، SLA، توزیع داده و ریسک Regression باید پیش از استقرار بررسی شوند.
هزینه ارزیابی Optimized Plan Forcing چگونه برآورد میشود؟
تعداد Queryهای بحرانی، محیط تست، آمادگی Query Store و زمان Regression Test عوامل اصلی هستند.
تفاوت Optimized Plan Forcing با Tuning دستی چیست؟
این قابلیت بخشی از تصمیم Optimizer را تطبیقی میکند، اما جایگزین Index، Statistics و Query صحیح نیست.
برای اجرای پروژه Optimized Plan Forcing چه خدماتی لازم است؟
ممیزی Plan، طراحی Benchmark، اجرای A/B، آموزش تیم و سند Rollback خروجیهای کاربردی پروژه هستند.
رایجترین خطای Optimized Plan Forcing چیست؟
انتظار نتیجه بدون بررسی Compatibility Level 160، Eligibility Query و شواهد Actual Plan رایجترین خطاست.
مهمترین معیار Performance در Optimized Plan Forcing چیست؟
Duration، CPU، Logical Reads و تغییر Optimization Replay باید همزمان تحلیل شوند.
Best Practice استقرار Optimized Plan Forcing چیست؟
Pilot محدود، داده شبیه Production، معیار پذیرش روشن و Monitoring پس از انتشار بهترین مسیر است.
Optimized Plan Forcing در کدام نسخه پشتیبانی میشود؟
مبنای این راهنما SQL Server 2022 و Compatibility Level 160 است؛ Build دقیق را نیز کنترل کنید.
سؤالات مصاحبه
- چه شواهدی اثر واقعی Optimized Plan Forcing را ثابت میکند؟
- تغییر Optimization Replay چگونه Plan را تحت تأثیر قرار میدهد؟
- چه زمانی خاموشکردن موقت Optimized Plan Forcing منطقی است؟
- چگونه بهبود یک Query را با Throughput کل سرور متعادل میکنید؟
- Rollback پس از Regression چگونه طراحی میشود؟
چکلیست نهایی
- Compatibility Level 160 بررسی شد.
- Baseline Plan، CPU، IO و Duration ثبت شد.
- Skew، NULL و حالت مرزی آزمایش شد.
- Query Store و فضای آن کنترل شد.
- A/B Test با Cache policy یکسان انجام شد.
- معیار پذیرش و Rollback تصویب شد.
- Monitoring پس از انتشار انجام شد.
جمعبندی
Optimized Plan Forcing زمانی انتخاب درستی است که مسئله واقعی به Optimization Replay و تغییر رفتار اجرا مربوط باشد. آن را یک لایه تطبیقی روی پایه سالم Schema، Statistics و Index در نظر بگیرید، نه جایگزین Tuning اصولی.
گام بعدی اجرای ده آزمایش این مقاله روی Query واقعی و مقایسه Plan Regression با Baseline است. برای دیدن ارتباط این قابلیت با سایر اعضای IQP، راهنمای جامع Intelligent Query Processing را مطالعه کنید.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان؛ قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620.
انجام پروژه، آموزش برنامهنویسی و آموزش SQL Server توسط مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی تاکنون.
برای سفارش پروژه، آموزش تخصصی، ایتا، واتساپ و تماس مستقیم با ما در ارتباط باشید.
تماس مستقیم با 09131253620
تماس با ما و ثبت درخواست