راهنمای جامع قابلیتهای پردازش هوشمند پرسوجو در SQL Server
IQP چیست و چرا یک کلید جادویی نیست؟
Intelligent Query Processing مجموعهای از قابلیتهای Optimizer و موتور اجرا است که تصمیمهای Plan را به داده واقعی، تاریخچه اجرا و الگوی پارامتر نزدیکتر میکند. یک عضو نوع Join را در زمان اجرا انتخاب میکند، عضوی دیگر Memory Grant را اصلاح میکند و گروهی برای چندشکلی Plan یا کاهش هزینه Compile طراحی شدهاند.
این مقاله نقشه تصمیم پانزده قابلیت را ارائه میکند، آنها را به خانوادههای منطقی تقسیم میکند و با جدول مقایسه و شش مثال ترکیبی نشان میدهد کدام قابلیت برای کدام علامت مناسب است. هر ردیف به مقاله مستقل و آماده انتشار همان موضوع لینک دارد.
مخاطب این راهنما DBA، Database Developer و تحلیلگر Performance است. پیشنیاز عملی، آشنایی با Actual Execution Plan، Statistics، Query Store و امکان آزمایش Compatibility Level خارج از Production است.
تعریف مجموعه و منطق مشترک
وجه مشترک IQP تبدیل بخشی از فرض ثابت Optimizer به تصمیم آگاه از اجرا است. با این حال، اثر اعضا یکسان نیست: برخی در همان Plan تصمیم میگیرند، برخی Feedback را میان اجراها نگه میدارند و برخی Dispatcher Plan، Query Variant یا Replay Script ایجاد میکنند.
انتخاب باید از علامت مسئله آغاز شود: Join نامناسب، Spill یا Overgrant، تخمین Cardinality، DOP نامتوازن، تخمین ضعیف MSTVF، هزینه Scalar UDF، نبود Batch Mode، نیاز به تقریب، Parameter Sniffing، Optional Predicate یا Compile Time زیاد.
این نقشه جایگاه Intelligent Query Processing Features را با محورهای Adaptive Joins، CE Feedback و PSP / OPPO نشان میدهد.
دستهبندی اجزا بر اساس نوع تصمیم
این جریان، مسیر Query از Adaptive Joins تا مشاهده PSP / OPPO را برای Intelligent Query Processing Features قابل پیگیری میکند.
جدول مقایسه و انتخاب سریع
| موضوع | کاربرد اصلی | نسخه و سازگاری | لینک |
|---|
| Adaptive Joins | گزارشهای پارامتری با Selectivity بسیار متغیر | SQL Server 2017 / CL 140 | آموزش کامل |
| Batch Mode Adaptive Joins | انبار داده با فیلترهای کوچک و بزرگ | SQL Server 2017 / CL 140 | آموزش کامل |
| Memory Grant Feedback | گزارشهای Sort و Aggregate با حجم نوسانی | SQL Server 2017 / CL 140 | آموزش کامل |
| Persistent Memory Grant Feedback | سامانههای دارای Restart یا فشار Plan Cache | SQL Server 2022 / CL 160 | آموزش کامل |
| Percentile Memory Grant Feedback | گزارشهایی با چند قله حجمی | SQL Server 2022 / CL 160 | آموزش کامل |
| Cardinality Estimation Feedback | دادههای دارای همبستگی ستونی | SQL Server 2022 / CL 160 | آموزش کامل |
| Degree of Parallelism Feedback | گزارشهای موازی روی سرور پرتراکنش | SQL Server 2022 / CL 160 | آموزش کامل |
| Interleaved Execution | رویههای قدیمی مبتنی بر Multi-Statement TVF | SQL Server 2017 / CL 140 | آموزش کامل |
| Table Variable Deferred Compilation | رویههایی با Table Variable چندصد یا چندهزار ردیفی | SQL Server 2019 / CL 150 | آموزش کامل |
| Scalar UDF Inlining | محاسبات ردیفبهردیف قیمت و امتیاز | SQL Server 2019 / CL 150 | آموزش کامل |
| Batch Mode on Rowstore | گزارشهای بزرگ روی جداول بدون Columnstore | SQL Server 2019 / CL 150 | آموزش کامل |
| Approximate Query Processing | داشبوردهای بزرگ که پاسخ سریع مهمتر از دقت مطلق است | SQL Server 2019 و 2022 / CL 150 | آموزش کامل |
| Parameter Sensitive Plan Optimization | ستونهای دارای توزیع بسیار نامتوازن | SQL Server 2022 / CL 160 | آموزش کامل |
| Optional Parameter Plan Optimization | صفحات جستوجو با فیلترهای اختیاری | SQL Server 2025 / CL 170 | آموزش کامل |
| Optimized Plan Forcing | Queryهای پیچیده با Compile Time بالا | SQL Server 2022 / CL 160 | آموزش کامل |
مثالهای ترکیبی و قابل اجرا
مثال ترکیبی 1: ثبت Baseline
این سناریو چند عضو IQP را در یک فرایند کنترلشده به هم متصل میکند و خروجی آن برای Baseline یا تصمیم استقرار استفاده میشود.
SELECT @@VERSION SqlVersion; SELECT name,compatibility_level FROM sys.databases WHERE name=DB_NAME();
| شاخص | نتیجه نمونه |
|---|
| مرحله | ثبت Baseline |
| هدف | نسخه و CL ثبت میشود. |
نکته فنی: همان Query و سیاست Cache را در مقایسه قبل و بعد حفظ کنید.
مثال ترکیبی 2: فعالسازی Query Store
این سناریو چند عضو IQP را در یک فرایند کنترلشده به هم متصل میکند و خروجی آن برای Baseline یا تصمیم استقرار استفاده میشود.
ALTER DATABASE CURRENT SET QUERY_STORE=ON; SELECT actual_state_desc,current_storage_size_mb FROM sys.database_query_store_options;
| شاخص | نتیجه نمونه |
|---|
| مرحله | فعالسازی Query Store |
| هدف | مخزن Plan و Runtime آماده میشود. |
نکته فنی: همان Query و سیاست Cache را در مقایسه قبل و بعد حفظ کنید.
مثال ترکیبی 3: بررسی Grant و Cardinality
این سناریو چند عضو IQP را در یک فرایند کنترلشده به هم متصل میکند و خروجی آن برای Baseline یا تصمیم استقرار استفاده میشود.
SET STATISTICS XML ON; SELECT object_id,COUNT_BIG(*) Cnt,MAX(name) MaxName FROM sys.all_objects GROUP BY object_id ORDER BY Cnt DESC; SET STATISTICS XML OFF;
| شاخص | نتیجه نمونه |
|---|
| مرحله | بررسی Grant و Cardinality |
| هدف | MemoryGrantInfo و Actual Rows بررسی میشوند. |
نکته فنی: همان Query و سیاست Cache را در مقایسه قبل و بعد حفظ کنید.
مثال ترکیبی 4: ساخت داده Skew برای PSP
این سناریو چند عضو IQP را در یک فرایند کنترلشده به هم متصل میکند و خروجی آن برای Baseline یا تصمیم استقرار استفاده میشود.
DROP TABLE IF EXISTS dbo.IQP_MainSkew; CREATE TABLE dbo.IQP_MainSkew(ID int IDENTITY PRIMARY KEY,CustomerID int); INSERT dbo.IQP_MainSkew(CustomerID) SELECT TOP (30000) CASE WHEN ABS(CHECKSUM(NEWID()))%100<80 THEN 1 ELSE 2+ABS(CHECKSUM(NEWID()))%500 END FROM sys.all_objects a CROSS JOIN sys.all_objects b; CREATE INDEX IX_IQP_MainSkew ON dbo.IQP_MainSkew(CustomerID);
| شاخص | نتیجه نمونه |
|---|
| مرحله | ساخت داده Skew برای PSP |
| هدف | مقادیر Hot و Cold ساخته میشوند. |
نکته فنی: همان Query و سیاست Cache را در مقایسه قبل و بعد حفظ کنید.
مثال ترکیبی 5: مقایسه دقیق و تقریبی
این سناریو چند عضو IQP را در یک فرایند کنترلشده به هم متصل میکند و خروجی آن برای Baseline یا تصمیم استقرار استفاده میشود.
DROP TABLE IF EXISTS dbo.IQP_MainVisitors; CREATE TABLE dbo.IQP_MainVisitors(VisitorID bigint); INSERT dbo.IQP_MainVisitors SELECT TOP (80000) ABS(CHECKSUM(NEWID()))%25000 FROM sys.all_objects a CROSS JOIN sys.all_objects b; SELECT COUNT(DISTINCT VisitorID) ExactCount,APPROX_COUNT_DISTINCT(VisitorID) ApproxCount FROM dbo.IQP_MainVisitors;
| شاخص | نتیجه نمونه |
|---|
| مرحله | مقایسه دقیق و تقریبی |
| هدف | خطای تقریب قابل سنجش میشود. |
نکته فنی: همان Query و سیاست Cache را در مقایسه قبل و بعد حفظ کنید.
مثال ترکیبی 6: گزارش Query Store
این سناریو چند عضو IQP را در یک فرایند کنترلشده به هم متصل میکند و خروجی آن برای Baseline یا تصمیم استقرار استفاده میشود.
SELECT TOP (30) q.query_id,p.plan_id,p.is_forced_plan,rs.count_executions,rs.avg_duration,rs.avg_cpu_time FROM sys.query_store_query q 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 ORDER BY rs.last_execution_time DESC;
| شاخص | نتیجه نمونه |
|---|
| مرحله | گزارش Query Store |
| هدف | Plan و Runtime در یک خروجی دیده میشوند. |
نکته فنی: همان Query و سیاست Cache را در مقایسه قبل و بعد حفظ کنید.
سناریوهای واقعی انتخاب قابلیت
در سامانه فروش، PSP برای مشتریان با اندازه متفاوت، OPPO برای فیلترهای اختیاری و Memory Grant Feedback برای گزارشهای تجمعی به کار میروند. این قابلیتها جایگزین یکدیگر نیستند؛ هر کدام علامت متفاوتی را هدف میگیرند.
در انبار داده، Batch Mode on Rowstore، Batch Mode Adaptive Join و Approximate Query Processing میتوانند مسیر تحلیلی را تغییر دهند. انتخاب باید با دقت موردنیاز، نوع Operator و اندازه داده انجام شود.
در محیط دارای Query Store، CE Feedback، DOP Feedback، Persistent Memory Grant Feedback و Optimized Plan Forcing لایه مدیریتی عمیقتری میسازند؛ Query Store ناسالم یا Read Only این چرخه را ناقص میکند.
هشدار نسخه و Compatibility Level
وجود نام قابلیت در نسخه SQL Server به معنی فعال بودن آن در هر پایگاه نیست. Compatibility Level، Database Scoped Configuration، Build و Eligibility Query همزمان تعیینکنندهاند. تغییر سطح سازگاری باید با Regression Test و Rollback Plan مدیریت شود.
اشتباهات رایج
| اشتباه | پیامد | اصلاح |
|---|
| فعالسازی همزمان | منبع تغییر نامشخص | تغییر مرحلهای |
| نبود Baseline | بهبود اثباتناپذیر | ثبت CPU، IO و Plan |
| داده یکنواخت | پنهانشدن Adaptive behavior | Skew و NULL |
| پاککردن Cache | حذف Feedback | سیاست ثابت |
| نادیدهگرفتن Query Store | شواهد ناقص | پایش state و فضا |
Performance Considerations و برنامه استقرار
استقرار باید Query محور باشد. Top Queryها را از Query Store یا DMV انتخاب کنید، علامت مسئله را به خانواده Join، Grant، Cardinality، Parallelism، Compilation یا Parameter Sensitivity نگاشت کنید و فقط قابلیت مرتبط را آزمایش کنید.
- Baseline را در بازه پرترافیک و کمترافیک ثبت کنید.
- صدک ۹۵ یا ۹۹ زمان پاسخ و Throughput را کنار میانگین بسنجید.
- هر تغییر معیار توقف و Rollback داشته باشد.
- پس از ارتقای Build، Forced Plan و Feedback پایدار بازبینی شود.
- فضا و Cleanup Policy Query Store پایش شود.
Best Practices
- مسئله را با شواهد Plan تعریف کنید.
- قابلیت را در کوچکترین Scope ممکن آزمایش کنید.
- Skew، NULL و حجمهای متفاوت را پوشش دهید.
- CPU کل سرور و Concurrency را کنار زمان Query بسنجید.
- نسخه و Cumulative Update را در Change Record ثبت کنید.
- انتشار تدریجی و Monitoring پس از انتشار انجام دهید.
این پنل، Best Path و خطای رایج Intelligent Query Processing Features را کنار CPU، IO و Latency قرار میدهد.
سؤالات متداول
آیا IQP بدون تغییر کد کار میکند؟
بسیاری از اعضا بدون تغییر متن Query اثر میگذارند، اما نسخه، Compatibility Level و Eligibility شرط هستند.
کدام قابلیت را اول انتخاب کنیم؟
از علامت مسئله شروع کنید: Spill، Skew، Optional Predicate، UDF یا Compile Time.
آیا Query Store ضروری است؟
برای همه اعضا نه، اما برای Feedback پایدار، Variant، Forced Plan و تحلیل قبل و بعد بسیار مهم است.
آیا IQP جایگزین Index Tuning است؟
خیر؛ Index، Statistics و Query SARGable همچنان پایه کارایی هستند.
ارزش تجاری IQP چگونه سنجیده میشود؟
Tail Latency، Throughput، CPU، tempdb Spill و رخداد Regression را به SLA متصل کنید.
خروجی پروژه مشاوره IQP چیست؟
فهرست Query کاندید، Baseline، ماتریس مسئله-قابلیت، A/B و Rollback Plan.
رایجترین خطای استقرار چیست؟
تغییر چند گزینه بدون Baseline و بدون امکان نسبتدادن نتیجه.
آیا ارتقای CL همیشه بهتر است؟
خیر؛ Planها ممکن است تغییر کنند و Regression Test ضروری است.
بهترین روش آزمایش چیست؟
محیط مشابه Production، داده Skew، پارامتر نماینده و ثبت چند معیار.
کدام نسخه پوشش بیشتری دارد؟
نسخه جدیدتر قابلیت بیشتری دارد؛ OPPO به Compatibility Level 170 وابسته است.
سؤالات مصاحبه
- تفاوت Feedback جاری و پایدار چیست؟
- چگونه مشکل Cardinality را از Memory Grant جدا میکنید؟
- Dispatcher Plan در PSP و OPPO چه نقشی دارد؟
- چرا Query Store برای IQP مهم است؟
- Rollback پس از تغییر Compatibility Level چگونه است؟
- تفاوت Adaptive Join و Batch Mode Adaptive Join چیست؟
چکلیست نهایی
- نسخه، Build و CL ثبت شد.
- Query Store سالم است.
- Queryهای کاندید اولویتبندی شدند.
- هر Query به قابلیت متناظر نگاشت شد.
- Skew و NULL آزمایش شد.
- A/B و معیار پذیرش تعریف شد.
- Rollback و مالک تغییر مشخص است.
- Monitoring پس از انتشار انجام میشود.
جمعبندی
IQP یک بسته ناهمگن است. انتخاب موفق از تشخیص علامت آغاز میشود و سپس فقط قابلیت متناظر با آزمایش قابل تکرار سنجیده میشود. فعالسازی همه گزینهها بدون Baseline راهکار حرفهای نیست.
برای ادامه، مقاله تخصصی هر عضو را از جدول انتخاب کنید و ده آزمایش آن را روی Query واقعی اجرا کنید. لینکهای زیر به Slugهای قطعی همین فایل SQL متصل هستند.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان؛ قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620.
انجام پروژه، آموزش برنامهنویسی و آموزش SQL Server توسط مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی تاکنون.
برای سفارش پروژه، آموزش تخصصی، ایتا، واتساپ و تماس مستقیم با ما در ارتباط باشید.
تماس مستقیم با 09131253620
تماس با ما و ثبت درخواست